【问题标题】:JPA 2.0 CriteriaBuilder : SELECT FROM … INJPA 2.0 CriteriaBuilder:从...中选择
【发布时间】:2017-09-12 08:31:18
【问题描述】:

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

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

这是我的课程:

简介:

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

    }

我该怎么做?

【问题讨论】:

    标签: java jpa jpa-2.0 criteria


    【解决方案1】:
    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();
    
    }
    

    【讨论】:

    • 该 sql 查询将返回 PROFIL 和 ROLEPROFIL 中的两列
    • 谢谢,我注意到你使用了Profil_.RoleProfil 我不认为这会起作用,因为我在Profil 中没有RoleProfil,而你使用query.where 而query 是未定义。
    • 再次更新。不确定它是否运行,我没有彻底使用标准 API。
    • emm,我不知道这个RoleProfil_.Profil 是否应该工作,但我收到一个错误提示Profil cannot be resolved or is not a field
    • 是的,抱歉,解决方案如下: - 根应该是RoleProfil 而不是Profil。 - 因为RoleProfil 已经在引用Profil,所以不会有Join in。 - 应该有一个选择来从结果中只选择Profil。 - 对于equal,它必须在参数和来自Role_ 的id 之间,而不是RoleProfil_.roleId 这是一个对象
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多