首页 > 解决方案 > 在未加入的字段中使用 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,嵌套字段上的子查询?

标签: spring-boothibernatekotlinspring-datacriteria

解决方案


推荐阅读