java - JPA 2.0 CriteriaBuilder : SELECT FROM … IN

标签 java jpa jpa-2.0 criteria

我想使用 JPA 2.0 CriteriaBuilder 创建以下 SQL 查询:

SELECT * FROM PROFIL WHERE PROFILID IN (SELECT PROFILID FROM ROLEPROFIL WHERE ROLEID = roleId)

这是我的类(class):

个人资料:

public class Profil extends AbstractDomain<Long> {

    @Id
    @Column
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "idgen_x")
    @UiInfo(name = "Identifiant")
    private Long profilId;

    @Column(nullable = false)
    @UiInfo(name = "Libellé")
    private String lib;

}

角色:

public class Role extends AbstractDomain<Long> {
    @Id
    @Column
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "idgen_x")
    @UiInfo(name = "Identifiant")
    private Long roleId;
}

角色配置:

public class RoleProfil extends AbstractDomain<Long> {
    @Id
    @Column
    @UiInfo(name = "Identifiant")
    private Long roleProfilId;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(nullable = false)
    @UiInfo(name = "Profil")
    private Profil profilId;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(nullable = false)
    @UiInfo(name = "Rôle")
    private Role roleId;

}

我想要做的是创建一个函数,该函数将使用 JPA 通过 Role ID 获取 Profils

这就是我开始的,但我是 JPA 新手,我不知道该怎么做:

public List<Profil> findProfilsByRoleId(Long roleId) {
        final CriteriaBuilder builder = getCriteriaBuilder();
        final CriteriaQuery<Profil> criteriaQuery = builder.createQuery(Profil.class);
        final Root<Profil> from = criteriaQuery.from(Profil.class);

        //TODO

        TypedQuery<Profil> query = getEntityManager().createQuery(criteriaQuery);
        return query.getResultList();

    }

我怎样才能做到这一点?

最佳答案

SELECT  PF.* 
FROM PROFIL AS PF
INNER JOIN ROLEPROFIL AS RPF
ON RPF.PROFILID = PF.PROFILID 
WHERE RPF.ROLEID = {roleId}

可能是更容易实现的查询。我认为java中的代码可能是这样的(我没有测试刚刚提出的解决方案):

public List<Profil> findProfilsByRoleId(Long roleId) {
    final CriteriaBuilder builder = getCriteriaBuilder();
    final CriteriaQuery<Profil> query = builder.createQuery(Profil.class);
    final Root<RoleProfil> from = query.from(RoleProfil.class);

    query.select(from.get(RoleProfil_.profilId));
    query.where(builder.equal(from.get(RoleProfil_.roleId).get(Role_.roleId), roleId));

    final TypedQuery<Profil> typedQuery = getEntityManager().createQuery(query);
    return typedQuery.getResultList();

}

关于java - JPA 2.0 CriteriaBuilder : SELECT FROM … IN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46171535/

相关文章:

java - 等效于 iOS Swift 中的 Java 接口(interface)回调

java - JPA 在 3 个级别上获取

java - 将数据库更改单独提交到主事务

java - 执行 SQL 的标准是什么?

JPA:根据多个子实体的多个标准选择实体

java - 我应该在 JPA2.0 中使用 Primitives 还是包装器?

java - 排序字母数字字符串java

java - 在postgresql中的UUID字段中存储非UUID字符串

java - 如何将java中的文件选择器限制为特定文件?

java - 为什么我的 JPA Repository Impl 代码没有被调用?