如何使用 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 查询(不推荐使用查询类型)的主要内容,如果未能解决你的问题,请参考以下文章
使用hibernate 5如何在第一次执行时创建一个带有ROW的表?
如何配置 Hibernate 5 以强制 Mysql 使用 Innodb 引擎创建表?