2011-05-06 96 views

回答

37

IN測試是您提供給查詢(或通過子查詢提取)的值中的單值路徑表達式(實體的持久屬性)的值。

MEMBER OF tests是您提供給您的實體中的一些集合中的值(或用表達式定義)值的成員的值。

讓我們的使用下面的示例中的實體:

@Entity 
public class EntityA { 
    private @Id Integer id; 
    private Integer someValue; 
    @ElementCollection 
    List<Integer> listOfValues; 

    public EntityA() { } 

    public EntityA(Integer id, Integer someValue, List<Integer> listOfValues) { 
     this.id = id; 
     this.someValue = someValue; 
     this.listOfValues = listOfValues; 
    } 
} 

及後續測試數據:

EntityA a1 = new EntityA(1, 1, Arrays.asList(4, 5, 6)); 
EntityA a2 = new EntityA(2, 2, Arrays.asList(7, 8, 9)); 

有了下面的查詢,我們得到A1的結果,因爲它是someValue中是一體的(0,1, 3)。在查詢中使用文字(SELECT a FROM EntityA where WHERE a.someValue IN(0,1,3))產生相同的結果。

TypedQuery<EntityA> queryIn = em.createQuery(
    "SELECT a FROM EntityA a WHERE a.someValue IN :values", EntityA.class); 
queryIn.setParameter("values", Arrays.asList(0, 1, 3)); 
List<EntityA> resultIn = queryIn.getResultList(); 

隨着下面的查詢,我們得到A2作爲結果,因爲圖7是在listOfValues的值之一:

TypedQuery<EntityA> queryMemberOf = em.createQuery(
    "SELECT a FROM EntityA a WHERE :value MEMBER OF a.listOfValues", EntityA.class); 
queryMemberOf.setParameter("value", 7); 
List<EntityA> resultMemberOf = queryMemberOf.getResultList(); 

此功能(包括集合作爲參數)在JPA 2.0規範定義,是未特定於Hibernate(以上代碼適用於EclipseLink)。

7

IN測試值是文字或查詢參數的顯式固定列表中的一個。

MEMBER OF測試值是否存在於JPA集合中,即實際上是對象模型的一部分的集合中。

+0

我不知道它是否是一個特定於hibernate的東西,但是IN與這裏的集合一起工作......但無論如何,成員似乎更合適。 – 2011-05-08 14:13:07

+0

使用JPA和Hibernate作爲提供者,使用IN沒有工作。必須使用MEMBER OF。 – Amalgovinus 2015-10-13 22:27:05

相關問題