Java 休眠不在子查询中

Java 休眠不在子查询中,java,hibernate,subquery,Java,Hibernate,Subquery,我的房间与半建筑有多对多的关系。 我想得到所有在给定日期没有讲座的房间 为什么这个hibernate查询不起作用 SELECT r FROM Room as r WHERE r NOT IN (SELECT DISTINCT ls.rooms FROM SeminarLecture AS ls WHERE ls.date <> :date) 如本文所述: 对于支持子选择的数据库,Hibernate支持查询中的子查询。子查询必须用括号括起来,通常由SQL聚合函数调用括

我的房间与半建筑有多对多的关系。 我想得到所有在给定日期没有讲座的房间

为什么这个hibernate查询不起作用

SELECT r FROM Room as r
WHERE r NOT IN
    (SELECT DISTINCT ls.rooms FROM SeminarLecture AS ls
    WHERE ls.date <> :date)
如本文所述:

对于支持子选择的数据库,Hibernate支持查询中的子查询。子查询必须用括号括起来,通常由SQL聚合函数调用括起来。即使是相关子查询,也允许在外部查询中引用别名的子查询

片段:

from DomesticCat as cat
where cat.name not in (
    select name.nickName from Name as name
)
因此,我们需要明确地说什么是不存在的

// instead fo this
// WHERE r NOT IN
// we have to say what is not IN
WHERE r.id NOT IN
    (SELECT DISTINCT ls.rooms FROM SeminarLecture AS ls
    WHERE ls.date <> :date)
还有另一端:

public class SeminarLecture {
    ...
    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "seminarLectures")
    public Set<Room> getRooms() {
        return this.rooms;
    }
那么我们需要的HQL是这样的:

public class Room {
    ...
    @ManyToMany(....
    public Set<SeminarLecture> getSeminarLectures() {
        return this.seminarLectures;
    }
SELECT r FROM Room as r
WHERE r.ID NOT IN
    (SELECT DISTINCT r.ID 
       FROM SeminarLecture AS ls
       JOIN ls.rooms r
       WHERE ls.date <> :date)
就是这样。我们从内部子查询中选择房间ID,并将其与外部查询中的相同ID进行比较


我的建议/方法是避免多对多。映射为一级公民的显式配对表将为我们提供更多信息。我们可以在这个联接表顺序上引入更多的属性,IsMain。。。。大多数情况下,过滤将变得更加简单和直接。

它在表中的一行上匹配,而不是在表本身上匹配,因此您需要指定r.idI未匹配的列,因为ls.rooms是一个房间对象列表,所以我想我需要比较rooms not ID和roomsif,如果我删除不同的,则消息应为TOP,LIMIT,我发现了你真正的问题。。这是多对多映射。我总是建议不要用那个。。。而原因正是这种情况,当我们很难过滤这些收集。。。但如果你能给我几分钟。。。我也许会教你如何。。。同时,你可以检查这一点,我用详细的解释和片段扩展了答案。应该清楚我们必须做什么。但正如我所说,我会避免多对多
SELECT r FROM Room as r
WHERE r.ID NOT IN
    (SELECT DISTINCT r.ID 
       FROM SeminarLecture AS ls
       JOIN ls.rooms r
       WHERE ls.date <> :date)