spring-boot - 在未加入的字段中使用 Criteria Builder
问题描述
我有一个酒店实体和 HotelReservation 实体。
我尝试获取可用的酒店进行预订。
理念:
获取所有酒店并删除不可用的酒店。(酒店在一定时间预定后不可用-函数中,有参数from
-> to
)。我按照 stackoverflow.com 上的示例生成了以下代码:
fun availableHotelsBetweenDates(from: ZonedDateTime, to: ZonedDateTime): Specification<Hotel> = Specification<Hotel> { root, query, cb ->
val reservationsBetweenDates: Subquery<HotelReservation> = query.subquery(HotelReservation::class.java)
val subqueryRoot = reservationsBetweenDates.from(HotelReservation::class.java)
val join: Join<Hotel, HotelReservation> = root.join("reservations", JoinType.LEFT)
reservationsBetweenDates.select(subqueryRoot.get("id"))
reservationsBetweenDates.where(activeReservationsBetweenDates(from, to).toPredicate(subqueryRoot, query, cb))
reservationsBetweenDates.distinct(true)
cb.not(join.get<Long>("id").`in`(reservationsBetweenDates))
}
此函数返回 0 个实体(应该返回 2 - 因为我有 3 家酒店,而一家酒店只有一个预订)。函数activeReservationsBetweenDates(from, to
)返回一个之间的Specification<HotelReservation>
所有HotelReservation from
,。to
如何正确使用not in,嵌套字段上的子查询?
解决方案
推荐阅读
- javascript - Multiple Website Status Check with Node JS
- html - 如何使用 target="(iframe name)" 打开指向另一个链接的链接?
- excel - 从一个工作簿复制到另一个工作簿,包括表格
- docker - 关于docker daemon如何初始化seccomp过滤器的问题
- r - 使用 R 列出来自 https 服务器的文件
- android - 如何安装适用于 Android 的 VirtualBox Guest Addition?
- ios - 如何从自定义框架访问故事板
- mysql - 跨 3 个表的 SQL 查询
- sql - spss modeler sql为日期声明一个变量
- vb.net - 为vb中的每个循环应用相同的颜色到相同的实体