Spring Boot HQL查询where子句将两个连接到一个表

时间:2017-10-30 11:32:06

标签: hibernate hql

我在Spring Boot中构建HQL查询时遇到问题。 有同样的问题,但在HQL中我找不到匹配的答案,这让我很清楚。

示例状态:

class Reservations{
 ...
 @ManyToMany 
 List<Day> avaDays;
 @ManyToMany
 List<Day> blockedDays;
}

class Day{
 ...
 Date date;
}

现在我想查找所有可用但未被阻止的预订。 最后来到这里:

@Query("
SELECT r.id, d.date 
FROM Reservation r, Day d
LEFT OUTER JOIN r.blockedDays
LEFT JOIN r.avaDays
WHERE d.date = 1506297600000" 

......并且没有结果。查询好吗?或者我错过了什么?

我现在很困惑,需要一点提示继续^^

先谢谢!

编辑:更进一步......

@Query("
SELECT r.id, d.date 
FROM Reservation r
LEFT OUTER JOIN r.blockedDays bd
LEFT OUTER JOIN r.avaDays ad
LEFT OUTER JOIN "furtherfilter" 
WHERE ad.date = 1506297600000 AND bd.date != 1506297600000" 

它有效。直到我在该查询上添加“进一步过滤器”,创建没有blockedDays条目的行...并显示该行无论如何。 我猜我现在需要再看看JOIN了。?

EDIT2:“解决方案”

上面的查询是对的。我在@Temporal(TemporalType.DATE)遇到了另一个问题,我在这里没有说过。

DB中保存的日期为:'2017-09-26 02:00:00' 并试图搜索:'2017-09-26'

它在MySQL DB上没有匹配,所以它返回所有匹配(来自进一步的过滤器)

2 个答案:

答案 0 :(得分:0)

这应该有效

SELECT r.id FROM Reservation r
WHERE d.avaDays.date = 1506297600000 and r.blockedDays.date != 1506297600000

但我觉得你的架构可能需要改变,你应该只需要blockedDays。如果您可以详细说明您的要求,我可以提供帮助。

答案 1 :(得分:0)

@Query("
SELECT r.id, d.date 
FROM Reservation r
LEFT OUTER JOIN r.blockedDays bd
LEFT OUTER JOIN r.avaDays ad
LEFT OUTER JOIN "furtherfilter" 
WHERE ad.date = 1506297600000 AND bd.date != 1506297600000" 

它有效。直到我在该查询上添加“进一步过滤器”,创建没有blockedDays条目的行...并显示该行无论如何。 我猜我现在需要再看看JOIN了。?

EDIT2:“解决方案”

上面的查询是对的。我在@Temporal(TemporalType.DATE)遇到了另一个问题,我在这里没有说过。

DB中保存的日期为:'2017-09-26 02:00:00' 并试图搜索:'2017-09-26'

它在MySQL DB上没有匹配,所以它返回所有匹配(来自进一步的过滤器)