【问题标题】:JPQL all element of collection in collection queryJPQL 集合查询中集合的所有元素
【发布时间】:2012-10-31 18:37:44
【问题描述】:

我有一个用户类:

 @Entity
 public class User implements Serializable {
 //..
 @ElementCollection(fetch = FetchType.EAGER)
 Set<UserPrivs> privs;
 //..
 }

其中 UserPrivs - 枚举。

我想创建方法List&lt;User&gt; getUsersByPrivs(Set&lt;UserPrivs&gt; privs),它将返回包含所有权限的所有用户。

我怎样才能做到这一点?

【问题讨论】:

    标签: jpa jpql


    【解决方案1】:

    喜欢这样使用 CriteriaBuilder?

    List<User> getUsersByPrivs(Set<UserPrivs> privs) {
        EntityManager em = getEntityManager();
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<User> cq = cb.createQuery(User.class);
        final Root<User> u = cq.from(User.class);
        List<Predicate> predicates = new ArrayList<>();
        for (UserPrivs priv : privs) {
            predicates.add(u.join("privs").in(Arrays.asList(priv)));
        }
        cq.where(cb.and(predicates.toArray(new Predicate[predicates.size()])));
        return em.createQuery(cq).getResultList();
    }
    

    【讨论】:

      【解决方案2】:
      Select u from User u join u.privs p where p.name in :privsNames
      

      这是任意的,要获得所有,您需要加入 u.privs n 次并将它们组合在一起。

      【讨论】:

        【解决方案3】:

        我希望这会有所帮助:

            String query = "select u from User u where 0=1 ";
            for (UserPrivs p : privs) {
                query += " or '" + p.name() + "' in u.privs";
            }
        

        【讨论】:

        • 非常感谢!这是一个很好的变体,但我可以在“纯”JPQL 上做吗?
        猜你喜欢
        • 2014-05-04
        • 2021-10-26
        • 2015-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多