我有一个用户类:
@Entity
public class User implements Serializable {
//..
@ElementCollection(fetch = FetchType.EAGER)
Set<UserPrivs> privs;
//..
}
其中UserPrivs - 枚举。
我想创建方法List<User> getUsersByPrivs(Set<UserPrivs> privs)
,它将返回包含所有权限的所有用户。
我怎样才能做到这一点?
答案 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";
}