当前位置: 首页 > 知识库问答 >
问题:

JPA 2.0 CriteriaBuilder:从...中选择

林修真
2023-03-14

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

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

以下是我的课程:

Profil:

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通过角色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();

    }

我该怎么做?

共有1个答案

郜修雅
2023-03-14
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();

}
 类似资料:
  • 问题内容: 我正在尝试从以下查询中获取行数。我只得到行计数为1,但有35条记录。您能否让我知道如何从内部查询中获取计数? 谢谢 问题答案: 您缺少FROM,需要为子查询指定别名。

  • 我正在尝试从一个select表单中获取一个时间值。我在代码中看不到任何错误,尝试更改所有类名和变量,但值仍然没有被get select。(提交表单后我看不到所选的值) 代码添加如下:

  • SQL可能如下所示: 如何将said SQL转换为querydsl? 编辑:因为它受到混淆:是的,这个例子是愚蠢的。不,我不想“优化”SQL。我所需要的只是一些生成完全相同(愚蠢的)SQL的QueryDSL代码。或者任何其他查询DSL代码生成任何类型的。如果可能的话。

  • 问题内容: 在查看查询日志时,我看到一个没有解释的奇怪模式。 在几乎每个查询之后,我都有“从DUAL中选择1”。 我不知道这是从哪里来的,而且我当然没有明确地进行查询。 日志基本上如下所示: 有人遇到过这个问题吗? MySQL版本:5.0.51 驱动程序:使用JDBC的Java 6应用程序。mysql-connector-java-5.1.6-bin.jar 连接池:commons-dbcp 1.

  • 下面是我得到的错误。 下面是HTML DOM

  • 问题内容: 尝试在angularjs中选择关于对象值的多个选项 这是一个代码: 和html jsfiddle上的(非)工作示例 http://jsfiddle.net/andrejkaurin/h9fgK/ 问题答案: 您尝试使用选择倍数(如复选框列表),这有点奇怪。多选输出一个数组。您不能将ng- model放在这样的选项标签上,而是放在选择本身上。因此,由于select将输出值数组,因此您需要