【问题标题】:How to properly create a JPQL Query using Hibernate 5 (Query type is deprecated)如何使用 Hibernate 5 正确创建 JPQL 查询(不推荐使用查询类型)
【发布时间】:2021-11-10 18:59:00
【问题描述】:

我使用的是 Hibernate 5.5,但在使用旧版 Hibernate 生成的通用 DAO 中使用不推荐使用的类型进行查询时遇到了麻烦。

我在通用 dao 类中的 createQuery 方法:

protected Query<?> createQuery(String query) {
    return getSession().createQuery(query);
}

此方法中没有已弃用的警报,但当我要在此代码中使用它时,我会收到已弃用的警报消息:

//find a user by name
public List<User> findByName(String name){
    Query<User> q = getSession().createQuery("from User where lower(nome) like lower(?)");
    q.setString(0, "%" + name +"%");
    return q.list();
}

在这里,我收到了 Query 类型及其 list() 方法中的已弃用警报。

为了不创建具有相同主题的另一个问题,我也在通用 dao 的其他方法中收到不推荐使用的警报:

protected Criteria createCriteria() {
    return getSession().createCriteria(this.clazz);
}

这里createCriteria方法也被弃用了。

getSession方法返回hibernateSessionFactory类的当前会话)

我想知道如何使用休眠 5 更新此代码,这样我就不会收到弃用的警报。

【问题讨论】:

    标签: hibernate jpql dao deprecated


    【解决方案1】:

    我在 Query 类型及其 list() 方法中收到不推荐使用的警报。

    我建议你用以下方式重写你的查询:

    public List<User> findByName(String name) {
       TypedQuery<User> query = session.createQuery(
           "select u from User u " +
           "where lower(u.nome) like lower('%' || :name || '%')", User.class);
       query.setParameter("name", name);
       return query.getResultList();
    }
    

    注意事项:

    1. 您应该使用TypedQuery 而不是已弃用的Query
    2. 正如hibernate documentation 中所述:

    尽管 HQL 不需要存在 select_clause,但通常最好包含一个。 对于简单查询,意图很明确,因此 select_clause 的预期结果很容易推断。但对于更复杂的查询,情况并非总是如此。

    通常最好明确指定意图。 即使在解析 JPQL 查询时,Hibernate 实际上也不会强制出现 select_clause,但是,对 JPA 可移植性感兴趣的应用程序应该注意这一点。

    1. 我建议您使用命名参数而不是位置参数,因为这样更具可读性。

    至于Criteria查询,请看文档的this section

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-21
      • 2014-11-26
      • 2011-05-11
      • 2021-08-10
      • 2014-08-01
      • 2018-10-05
      • 1970-01-01
      • 2016-07-06
      相关资源
      最近更新 更多