2012-11-12 115 views
3

集合的元素我有一個用戶等級:JPQL都在收集查詢

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

其中UserPrivs - 枚舉。

我想創建方法List<User> getUsersByPrivs(Set<UserPrivs> privs),它將返回包含所有priv的所有用戶。

我該如何做到這一點?

回答

0

我希望這有助於:

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

非常感謝!這是很好的變體,但我可以在'純粹'的JPQL上做到嗎? – ricoshet

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

這是任何,讓所有,你需要加入到u.privs n次,並把它們一起。

2

喜歡這個使用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(); 
}