更新:在下面查看我的答案,了解如何检查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 >();
...
}
现在,我希望获取包含状态NEW
或PENDING
(或两者)的所有实体。
我正在尝试使用此查询:
SELECT DISTINCT u FROM MyEntity u WHERE u.statusTypes in :statusTypes
但我得到例外:org.postgresql.util.PSQLException: No value specified for parameter 9.
如何正确查询集合并按交叉点过滤?
答案 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