条件 API 不在 @ElementCollection 中
Criteria API not in @ElementCollection
由于 Permission
是一个枚举,是否可以 select 所有用户在没有特定权限的情况下使用 JPA 标准 API:
@Entity
public class User {
@ElementCollection
@CollectionTable(joinColumns = @JoinColumn(name = "USER_ID"))
private Set<Permission> permissions = new HashSet<>();
}
我目前的做法(returns 没有):
// 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();
我最终使用子查询 select 所有具有特定权限的用户并将他们从结果集中排除。
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());
由于 Permission
是一个枚举,是否可以 select 所有用户在没有特定权限的情况下使用 JPA 标准 API:
@Entity
public class User {
@ElementCollection
@CollectionTable(joinColumns = @JoinColumn(name = "USER_ID"))
private Set<Permission> permissions = new HashSet<>();
}
我目前的做法(returns 没有):
// 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();
我最终使用子查询 select 所有具有特定权限的用户并将他们从结果集中排除。
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());