JPQL集合查询中的所有集合元素

时间:2012-11-12 10:25:54

标签: jpa jpql

我有一个用户类:

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

其中UserPrivs - 枚举。

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

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:3)

像这样使用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();
}

答案 1 :(得分:1)

Select u from User u join u.privs p where p.name in :privsNames

这是任何一个,为了得到所有,你需要加入u.privs n次和AND他们在一起。

答案 2 :(得分:0)

我希望这会有所帮助:

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