【发布时间】:2020-12-11 18:20:39
【问题描述】:
我正在为一个项目构建一个简单的可出租的预订应用程序。如果没有其他与所需预订相冲突的预订,用户可以预订房屋。
我有两个实体类 - Rentable 和 Reservation
预订与可出租和 2 个感兴趣的领域具有 @ManyToOne 关系——reserveFrom 和 reserveUntil。
问题如下:
因为我希望提供分页功能,所以我需要一种返回响应块的方法,因此应用程序级别的解决方案(即通过将所有内容加载到内存中进行过滤等)非常昂贵。
用户应该能够提供两个日期(从、到),然后返回大量可用的可出租物品。
有关如何实现此查询的任何指南?我可以看到以下情况:如果存在属于可出租的某些其他预留 r2,则特定预留 r1 的可出租不可用
r2.reserveFrom
r2.reserveFrom
r1.reserveFrom
目前我想到的一个基线查询如下(输入:f (from), t (to))
SELECT DISTINCT rentable
FROM Rentable rentable JOIN Reservation reservation
WHERE NOT (f BETWEEN reservation.reserveFrom AND reservation.reserveUntil
OR t BETWEEN reservation.reserveFrom AND reservation.reserveUntil
OR (f > reservation.reserveFrom AND t < reservation.reserveUntil))
这样做的问题是,仅仅因为一行通过了过滤器,并不意味着应该返回可出租的(其他一些行可能会取消它的资格)。
我觉得必须涉及一些 EXISTS 子句。任何帮助表示赞赏。
【问题讨论】:
-
可以在数据库中创建exclusion constraint。
标签: sql postgresql jpa jpql