Hibernate 使用IN运算符运行JPQL查询时发生sql错误

Hibernate 使用IN运算符运行JPQL查询时发生sql错误,hibernate,postgresql,jpa-2.0,Hibernate,Postgresql,Jpa 2.0,我有以下2个JPA课程: @Entity public class AnalysisPolicy { private Set rules; //stuff omitted @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) public Set getRules() { return rules; } } @Entity public class Analysis

我有以下2个JPA课程:


@Entity
public class AnalysisPolicy {
    private Set rules;
    //stuff omitted
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    public Set getRules() {
        return rules;
    }
}

@Entity
public class AnalysisRule {
    //stuff omitted
}
以及以下JPQL查询: 它接受一个类型为java.util.UUID的参数ruleId,它是我用作所有实体的@Id的类。 尝试执行查询时,我得到以下结果:

Hibernate: /* select p from AnalysisPolicy p, AnalysisRule r where r.id=:ruleId and r in p.rules */ select analysispo0_.f_id as f1_12_, analysispo0_.f_lastmodified as f2_12_, analysispo0_.global as global12_ from AnalysisPolicy analysispo0_ cross join AnalysisRule analysisru1_ cross join AnalysisPolicy_AnalysisRule rules2_, AnalysisRule analysisru3_ where analysispo0_.f_id=rules2_.AnalysisPolicy_f_id and rules2_.rules_f_id=analysisru3_.f_id and analysisru1_.f_id=? and ( analysisru1_.f_id in ( . ) ) limit ? [org.hibernate.util.JDBCExceptionReporter] SQL Error: 0, SQLState: 42601 [org.hibernate.util.JDBCExceptionReporter] ERROR: syntax error at or near "." 这意味着我的JPQL被hibernate接受,但由于某种原因,它生成的SQL在中的analysisru1_U1.f_id无效。部分

我在数据库中使用hibernate 3.6和postgresql 9。 我做错了什么?

查询是错误的,不能这样使用。你应该写

select p from AnalysisPolicy p, AnalysisRule r 
    where r.id=:ruleId and r in elements(p.rules)

但以下问题可能是最好的:

select p from AnalysisPolicy p join p.rules r where r.id=:ruleId

你的HQL看起来让我很困惑。我想你可以改写成这样:

select r.p from AnalysisRule r where r.id=:ruleId
它将返回包含给定规则的所有策略。您甚至可以在此处放置一个独特的:-


编辑:axtavt比我更快,提供了更好的答案。似乎我们对重写HQL查询也有类似的想法

首先,非常感谢你,你的建议奏效了,到目前为止,你只尝试了第一个。你能详细解释一下为什么你的三个建议之间有差异,第三个建议的优点是什么,为什么hibernate接受了我明显错误的查询,并且没有抛出任何东西-@radai:前两种方法更详细,生成额外的子查询请参见生成的SQL。尽管现代数据库优化器应该能够消除它,但最后一种方法更为明确。关于Hibernate的行为,Hibernate有很多怪癖。也许这可以被称为一个bug,但是,错误的查询最终导致了异常:。Hibernate的HQL到SQL转换一开始是非常基本的,在Hibernate 3中只得到了一个正确的解析器。仍然可以在HQL中编写许多解析器接受但仍然没有意义的东西。
select p from AnalysisPolicy p join p.rules r where r.id=:ruleId
select r.p from AnalysisRule r where r.id=:ruleId