HQL。两个列表的交集

时间:2015-05-05 21:15:24

标签: java hibernate

更新:在下面查看我的答案,了解如何检查2个列表是否相交(@ElementCollection是否包含字符串/枚举,而常用实体列表是否映射为@OneToMany

我有一个实体,其中包含@ElementCollection字段和枚举。

public enum StatusType { 
    NEW, PENDING, CLOSED;
}

@Entity
public class MyEntity {
    @ElementCollection
    @CollectionTable(name = "status_type", joinColumns = {@JoinColumn(name = "my_entity_id")}) 
    @Column(name = "status_type", nullable = false)
    private Set<StatusType > statusTypes = new HashSet<StatusType >();

    ...
}

现在,我希望获取包含状态NEWPENDING(或两者)的所有实体。

我正在尝试使用此查询:

SELECT DISTINCT u FROM MyEntity u WHERE u.statusTypes in :statusTypes 

但我得到例外:org.postgresql.util.PSQLException: No value specified for parameter 9.

如何正确查询集合并按交叉点过滤?

1 个答案:

答案 0 :(得分:3)

通过向HQL添加JOIN子句解决了问题。 Hibernate无法隐式识别出查询需要JOIN子句。可能它会帮助某人:

SELECT DISTINCT u FROM MyEntity u
LEFT JOIN u.statusTypes statusTypes
WHERE statusTypes in :statusTypes 

我设置了这样的查询参数:

query.setParameter( "statusTypes", listOfStatusTypesEnums);

它将选择实体的listOfStatusTypesEnums属性中存在statusTypes列表的至少一个元素的行(即,如果2列表以某种方式相交)。

如果您有通常的实体列表(不是@ElementCollection,而是@OneToMany等),同样的规则也可以使用。只需使用:LEFT JOIN u.subEntities subEntities WHERE subEntities.id in :subEntityIds