如何使用 Hibernate 5 正确创建 JPQL 查询(不推荐使用查询类型)

Posted

技术标签:

【中文标题】如何使用 Hibernate 5 正确创建 JPQL 查询(不推荐使用查询类型)【英文标题】:How to properly create a JPQL Query using Hibernate 5 (Query type is deprecated) 【发布时间】: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 更新此代码,这样我就不会收到弃用的警报。

【问题讨论】:

【参考方案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();

注意事项:

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

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

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

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

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

【讨论】:

以上是关于如何使用 Hibernate 5 正确创建 JPQL 查询(不推荐使用查询类型)的主要内容,如果未能解决你的问题,请参考以下文章

来自单侧的多对多关系需要从另一侧 jpq

使用hibernate 5如何在第一次执行时创建一个带有ROW的表?

如何配置 Hibernate 5 以强制 Mysql 使用 Innodb 引擎创建表?

初识Hibernate 以及如何使用Maven创建Hibernate项目

Postgres没有用hibernate正确创建表?

如何从 entitymanager 访问 Hibernate 统计信息?