2017-09-15 99 views
1

隨着Permission是一個枚舉,是可以選擇的所有用戶,而無需使用JPA標準API一定的權限:標準API不@ElementCollection

@Entity 
public class User { 

    @ElementCollection 
    @CollectionTable(joinColumns = @JoinColumn(name = "USER_ID")) 
    private Set<Permission> permissions = new HashSet<>(); 

} 

我目前的做法(沒有返回值):

// em => EntityManager 
// cb => CrieriaBuilder 
Root<User> root = query.from(User.class); 
query.select(root); 
SetJoin<User, Permission> join = root.joinSet("permissions"); 
query.where(cb.not(cb.equal(join, Permission.RULE_THEM_ALL))); 
List<User> result = em.createQuery(query).getResultList(); 
+0

爲什麼SQL標籤? – jarlh

+1

JPQL等價於'SELECT u FROM User u WHERE:myPerm IN u.permissions'你不能做「Set == elementValue」,但你可以使用IN – DN1

回答

0

我最終使用子查詢來選擇具有特定權限的所有用戶,並將它們從結果集中排除。

CriteriaQuery<User> query = cb.createQuery(User.class); 
Root<User> root = query.from(User.class); 
query.select(root); 

Subquery<Long> subquery = query.subquery(Long.class); 
Root<User> subroot = subquery.from(User.class); 
SetJoin<User, Permission> join = subroot.join("permissions"); 
subquery.select(subroot.get("id")).where(cb.equal(join, Permission.RULE_THEM_ALL)); 

query.where(root.get("id").in(subquery).not());