【问题标题】:Converting JPA specification to JPQL将 JPA 规范转换为 JPQL
【发布时间】:2019-01-13 09:16:15
【问题描述】:

我们在实体上定义了 JPA 规范。我想将该规范转换为 JPQL,因此我可以创建与其他实体的连接。 (我尝试使用父子关系,但效率不高,并且不允许我们将过滤(规范)放在智利实体上)。早些时候,我们从一个表中读取数据,因此我们制定了运行良好的规范。现在我们需要将它与另一个实体连接起来,为此我想使用 JPQL 而不是规范。我想将一张表上的规范转换为 JPQL,然后将其与其他实体连接。

【问题讨论】:

    标签: hibernate spring-data-jpa jpql jpa-criteria


    【解决方案1】:

    在您的存储库方法上使用@query 注释,并在@query 注释中编写您的 JPQL 查询。

    您可以在@query 注释中使用您的实体名称来引用表名。

    【讨论】:

    • 不,我想将现有规范转换为 JPQL,例如:String jpql = query.where(....);
    【解决方案2】:

    假设您有用户和列表实体

    在 JPQL 中你会写这样的东西

    public List<User> getUserByName(String username) {
        String queryString = "select u from User u where u.name= '"+username+"' ";
        Query query = getEntityManager().createQuery(queryString);
        return query.getResultList();
    }
    

    JPA 和 Hibernate 早于 5.1

    即使使用 JPA 2.1 和 Hibernate 5.0,仍然无法连接两个不相关的实体。

    如果用户和用户地址不相关

    List<Object[]> results = em.createQuery("SELECT u FROM User u, UserAddress ua WHERE u.firstName = ua.firstName AND u.lastName = ua.lastName").getResultList();
    

    Hibernate 会将其转换为类似这样的交叉连接

    User user01_ cross join UserAddress useraddress1_
    

    使用休眠 5.1

    相同的查询将被视为内部联接

    List<Object[]> results = em.createQuery("SELECT u FROM User u, UserAddress ua WHERE u.firstName = ua.firstName AND u.lastName = ua.lastName").getResultList();
    
    User user01_ inner Join UserAddress useraddress1_
    

    其他展示点:

    不允许在连接子句中使用子查询。在 JPQL 中,子查询只允许在 WHERE 和 HAVING 部分。

    【讨论】:

    • 我的问题是将规范转换为查询,有什么办法可以做到吗?无需将规范重写为 JPQL。
    猜你喜欢
    • 1970-01-01
    • 2016-07-06
    • 2019-09-02
    • 2014-08-04
    • 2013-05-29
    • 1970-01-01
    • 2014-08-02
    • 2014-10-19
    • 2018-03-16
    相关资源
    最近更新 更多