【问题标题】:What's the difference between the IN and MEMBER OF JPQL operators?IN 和 MEMBER OF JPQL 运算符有什么区别?
【发布时间】:2011-08-20 10:11:40
【问题描述】:

INMEMBER OF JPQL 运算符有什么区别?

【问题讨论】:

    标签: java jpa jakarta-ee jpql


    【解决方案1】:

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

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

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

    @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 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();
    

    通过以下查询,我们得到 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)。

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我不知道这是否是休眠特定的东西,但 IN 在这里与集合一起使用......但无论如何成员似乎更合适。
    • 使用 JPA 和 Hibernate 作为提供者,使用 IN 不起作用。必须使用 MEMBER OF。
    猜你喜欢
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2015-05-30
    相关资源
    最近更新 更多