IN和MEMBER成员之间的区别是什么?

fae*_*anj 40 java jpa jpql java-ee

IN和MEMBER成员之间的区别是什么?

Mik*_*unu 50

IN测试是您提供给查询(或通过子查询获取)的值中单值路径表达式(实体的持久属性)的值.

成员测试是您在实体的某些集合中为查询(或使用表达式定义)值的成员提供的值.

让我们使用以下示例实体:

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

并遵循测试数据:

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

使用以下查询,我们得到a1作为结果,因为它的someValue是(0,1,3)之一.在查询中使用文字(SELECT a FROM EntityA a 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();
Run Code Online (Sandbox Code Playgroud)

使用以下查询,我们得到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();
Run Code Online (Sandbox Code Playgroud)

此功能(包括作为参数的集合)在JPA 2.0规范中定义,并不特定于Hibernate(上面的代码适用于例如EclipseLink).


Mic*_*rdt 11

IN 测试值是否是文字或查询参数的显式固定列表之一.

MEMBER OF 测试JPA集合中是否存在值,即实际上是对象模型的一部分的集合.