在处理基础集合时,hibernate意外结束子树

时间:2011-01-04 08:23:22

标签: hibernate jpa persistence jpql

我有以下实体:

@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有一个内部选择,这在性能方面确实很糟糕。

我的方法是什么? (假设我不想将集合“升级”为实体集合。)

2 个答案:

答案 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