我是 Spring Data 的初学者,我必须编写我的第一个困难查询:)
我正在为一个 Activity 制作一个预订引擎。我的数据模型由以下部分组成:
- 一个
RoomType
定义房间可能配置的实体(例如双人间、三人间、四人间) - 一个
Room
代表实际房间的实体 - 一个
RoomArrangement
定义所有可能的实体RoomTypes
对于Room
(例如7号房间可以配置为三人间或双人间) - 一个
RoomAssignment
代表预订后为房间选择的实际配置的实体
FK 是这样配置的
RoomType <--* RoomArrangement *--> Room <-- RoomAssignment
(有关实体定义,请参阅下面的代码)
我需要找到Room
没有Assignment
对于给定的 RoomType
具有最高优先级(= 最接近 1) .
我已如下配置 Spring。
RoomType.java
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "room_type_id")
private List<RoomArrangement> roomArrangements;
RoomArrangement.java
@ManyToOne(targetEntity = RoomType.class)
@JoinColumn(name = "room_type_id", nullable = false)
private RoomType roomType;
@ManyToOne(targetEntity = Room.class)
@JoinColumn(name = "room_id", nullable = false)
private Room room;
@Column(name = "priority")
private Integer priority;
房间.java
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "room_id")
private List<RoomArrangement> roomArrangements;
@OneToOne(fetch = FetchType.LAZY, mappedBy = "room", cascade = CascadeType.ALL)
private RoomAssignment assignment;
RoomArrangementRepository.java
RoomArrangement findFirstByRoomTypeAndRoom_AssignmentIsNullOrderByPriorityAsc(RoomType rt);
上面的查询被翻译为
select
roomarrang0_.id as id1_3_,
roomarrang0_.priority as priority2_3_,
roomarrang0_.room_id as room_id3_3_,
roomarrang0_.room_type_id as room_typ4_3_
from
room_arrangements roomarrang0_
left outer join
rooms room1_ on roomarrang0_.room_id=room1_.id
where
roomarrang0_.room_type_id=9
and
(room1_.id is null)
order by
roomarrang0_.priority asc
limit 1;
问题有两个:
- 我不知道where子句在哪里 (room1_.id 为空) 来自
- 我不知道“AndRoom_AssignmentIsNull”子句去了哪里
我应该“反转”OneToOne 关系并将 FK 放在 Room 类上吗?
感谢您的帮助! 洛伦佐
<小时/>我尝试应用一些建议,并“转动”RoomRepository 上的查询。
查询是这样的:
Room findFirstByRoomArrangements_RoomTypeAndAssignmentIsNullOrderByRoomArrangements_PriorityAsc(RoomType rt);
我们遇到了同样的问题: 选择 room0_.id 为 id1_6_, room0_.room_name 为 room_nam2_6_ 从 房间 room0_ 左外连接 room_arrangements roomarrang1_ on room0_.id=roomarrang1_.room_id 在哪里 roomarrang1_.room_type_id=? 和 (room0_.id 为空) 订购依据 roomarrang1_.priority asc 限制?;
我认为问题在于 Room 和 RoomAssignment 之间的一对一关系在数据库中表示为 room_assignments 表上的 FK 到 rooms 表。
我会尝试将 FK 放在 rooms 表上,而不是放在 room_assignments 表上,看看是否有变化。
最佳答案
如果您需要找到一个没有分配的房间,您不应该在房间存储库中查找吗?
关于java - 存储库中的查询未正确翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54420360/