我有以下实体:
@Entity
public class AnalysisPolicy extends PersistentEntity{
private Set nodeIds;
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(
name="analysis_policy_nodes",
joinColumns=@JoinColumn(name="analysis_policy_id")
)
@Column(name="node_id")
public Set<Long> getNodeIds() {
return nodeIds;
}
}
并尝试以下JPQL查询:
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(
name="analysis_policy_nodes",
joinColumns=@JoinColumn(name="analysis_policy_id")
)
@Column(name="node_id")
public Set<Long> getNodeIds() {
return nodeIds;
}
结果如下:
select p from AnalysisPolicy p where p.nodeIds is not empty
后跟一个长堆栈跟踪。我发现了一个类似的stackoverflow问题here,问题是基本实体的集合的语法不同,所以我现在想的是我的“非空”部分应该替换为其他东西。 另外,我无法工作“不是空”。 “size(nodeIds)&gt; 1”有效,但生成的SQL有一个内部选择,这在性能方面确实很糟糕。
我的方法是什么? (假设我不想将集合“升级”为实体集合。)
答案 0 :(得分:7)
HQL文档描述了以下语法,它也适用于Hibernate的JPQL:
select p from AnalysisPolicy p where exists elements(p.nodeIds)
另见:
答案 1 :(得分:0)
你可以试试这个:
select p from AnalysisPolicy as p join p.nodeIds group by p