标准API不在@ElementCollection中 [英] Criteria API not in @ElementCollection

查看:81
本文介绍了标准API不在@ElementCollection中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用Permission作为枚举,可以使用JPA Criteria API在没有一定许可的情况下选择所有用户:

With Permission being an enumeration, is it possible to select all users without a certain permission using JPA Criteria API:

@Entity
public class User {

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

}

我目前的方法(不返回任何内容):

My current approach (returns nothing):

// 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();

推荐答案

我最终使用子查询选择了具有特定权限的所有用户,并将它们从结果集中排除.

I ended up using a subquery to select all users with the specific permission and exclude them from the result set.

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());

这篇关于标准API不在@ElementCollection中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆