2015-05-05 33 views
2
交叉口

更新:看下面我的答案如何檢查2個列表相交(無論是@ElementCollection用字符串/枚舉和往常一樣的實體列表映射像@OneToManyHQL。兩個列表

我有一個包含@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.

如何正確的收集和過濾器通過交叉查詢?

回答

2

問題通過向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