Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HQL/JPA查找日期范围之间的可用项目_Java_Mysql_Sql_Hibernate_Jpa - Fatal编程技术网

Java HQL/JPA查找日期范围之间的可用项目

Java HQL/JPA查找日期范围之间的可用项目,java,mysql,sql,hibernate,jpa,Java,Mysql,Sql,Hibernate,Jpa,这是租车应用程序。 我有一张桌子: +-------------------------------------+ |id |start_date |end_date |car_id| +----+------------+------------+------+ |1 |2017-04-01 |2017-04-10 |1 | |2 |2017-04-15 |2017-04-20 |1 | |3 |2017-04-15 |2017-04-20

这是租车应用程序。 我有一张桌子:

+-------------------------------------+
|id  |start_date  |end_date    |car_id| 
+----+------------+------------+------+  
|1   |2017-04-01  |2017-04-10  |1     |
|2   |2017-04-15  |2017-04-20  |1     |
|3   |2017-04-15  |2017-04-20  |2     |
+----+------------+------------+------+ 
Hibernate查询查找用户输入“userDateStart”和“userDateEnd”之间的所有可用汽车

select
b.id, b.startDate, b.endDate, b.car.id
from BorrowedDate as b
where :userDateStart not between startDate and endDate
and :userDateEnd not between startDate and endDate

------------
:userDateStart = 2017-04-02 00:00:00
:userDateEnd = 2017-04-10 00:00:00
我的结果是:

+-------------------------------------+
|id  |start_date  |end_date    |car_id| 
+----+------------+------------+------+  
|2   |2017-04-15  |2017-04-20  |1     |
|3   |2017-04-15  |2017-04-20  |2     |
+----+------------+------------+------+ 

结果是错误的,因为id=1的汽车在这次被借用了。只有car_id=2可用。

我认为您正在寻找一个完全重叠的周期。这是完全重叠的正确逻辑:

select b.id, b.startDate, b.endDate, b.car.id
from BorrowedDate as b
where :userDateStart <= startDate and
      :userDateEnd >= endDate;

注意:这是标准的SQL。Hibernate有一些不寻常的约定,但想法应该是一样的。

我发现您的查询是正确的

但如果您想根据汽车id进行选择,那么您也应该将汽车id作为一个条件添加到查询中

比如说

SELECT b.id, b.startDate, b.endDate, b.car.id
FROM BorrowedDate b
WHERE :userDateStart NOT BETWEEN b.startDate AND b.endDate
AND :userDateEnd NOT BETWEEN b.startDate AND b.endDate
AND b.car.id = :carId
或者你也可以这样做

SELECT b.id, b.startDate, b.endDate, c.id
FROM BorrowedDate b INNER JOIN b.car c
WHERE :userDateStart NOT BETWEEN b.startDate AND b.endDate
AND :userDateEnd NOT BETWEEN b.startDate AND b.endDate
AND c.id = :carId
然后必须通过:carId值等于2

更新

如果需要获得动态结果,可以尝试此SQL查询,我将很快用JPQL更新它

SELECT b.id, b.startDate, b.endDate, b.car.id
FROM BorrowedDate b
WHERE '2017-04-02 00:00:00' NOT BETWEEN b.startDate AND b.endDate
AND '2017-04-10 00:00:00' NOT BETWEEN b.startDate AND b.endDate
AND b.car.id NOT IN (SELECT DISTINCT bd.car.id FROM BorrowedDate bd WHERE '2017-04-02 00:00:00' BETWEEN bd.startDate AND bd.endDate OR '2017-04-10 00:00:00' BETWEEN bd.startDate AND bd.endDate) 
这里也有JPQL


在我看来是正确的。它在id=2的行上可用@JackFlamp不正确,因为在此时间范围内的车id=1不可用。其他日期有售。但我想从userinput获得在特定时间范围内可用汽车的列表。您的查询@mibrahim.iti无法正常工作。选择b.id,b.startDate,b.endDate,b.car.id FROM borroedDate b其中'2017-04-02 00:00:00'>=b.startDate和'2017-04-10 00:00:00'@twistezo是的,我在某些方面错了,我编辑了我的答案,实际上你的主要查询是对的,但你错过了我看到的car idok的状况,但我不希望按特定的汽车id进行搜索。我希望从一个查询中获得所有可用汽车的列表。您不需要使用JPQL更新此列表,因为您的最后一个答案在Hibernate控制台中逐字都非常有效。谢谢你@mibrahim。iti@twistezo不客气,但我还是用JPQL对其进行了更新,我想HQL也是如此,应该是这样吗?从car中选择b.car.id作为c,借用日期作为b,如果不存在,从b中选择1,其中“2017-04-02 00:00:00”=开始日期它不为我返回任何内容。在查询中选择1意味着什么?这似乎是正确的逻辑。选择1只是选择任何值,1很容易输入。在整个时间段内,您似乎没有可用的汽车。
SELECT b.id, b.startDate, b.endDate, b.car.id
FROM BorrowedDate b
WHERE '2017-04-02 00:00:00' NOT BETWEEN b.startDate AND b.endDate
AND '2017-04-10 00:00:00' NOT BETWEEN b.startDate AND b.endDate
AND b.car.id NOT IN (SELECT DISTINCT bd.car.id FROM BorrowedDate bd WHERE '2017-04-02 00:00:00' BETWEEN bd.startDate AND bd.endDate OR '2017-04-10 00:00:00' BETWEEN bd.startDate AND bd.endDate) 
SELECT model.id, model.startDate, model.endDate, model.car.id
FROM BorrowedDate model
WHERE :userDateStart NOT BETWEEN model.startDate AND model.endDate
AND :userDateEnd NOT BETWEEN model.startDate AND model.endDate
AND model.car.id NOT IN (SELECT DISTINCT b.car.id FROM BorrowedDate b WHERE :userDateStart BETWEEN b.startDate AND b.endDate OR :userDateEnd BETWEEN b.startDate AND b.endDate)