Hibernate 使用IN运算符运行JPQL查询时发生sql错误
我有以下2个JPA课程: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
@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