java - 存储库中的查询未正确翻译

标签 java spring-boot spring-data-jpa java-11

我是 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;

问题有两个:

  1. 我不知道where子句在哪里 (room1_.id 为空) 来自
  2. 我不知道“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/

相关文章:

java - 我可以在 String 变量中存储特殊符号吗?

java - Spring Batch (2.2) Java Config + Quartz 作为调度程序

java - 如何使用 Java 而不是 XML 将 hbase 与 Spring Boot 一起使用?

tomcat - 如何将 TomcatEmbeddedServletContainerFactory 与 AbstractAnnotationConfigDispatcherServletInitializer 一起使用

java - hibernate JPA : 'IS EMPTY' condition doesn't work for collections passed as parameters

java - 需要动态更改数据源url的数据库名称( Multi-Tenancy 数据库)

java - PDFlib 复制页面并使用字体

java - 将 iCalendar 发送到网页时没有行分隔。 java

java - 当使用 JPA Hibernate 将子项和父项存储在同一个表中时,在当前和所有后续父项中使用提供的值进行搜索

hibernate - JPA Hibernate 运行时动态实体映射和持久化