Hibernate 5.2 版本 -> 很多查询方法已弃用?
Posted
技术标签:
【中文标题】Hibernate 5.2 版本 -> 很多查询方法已弃用?【英文标题】:Hibernate 5.2 version -> A lot of Query methods deprecate? 【发布时间】:2016-11-22 11:31:44 【问题描述】:我是 Hibernate 的新手。
我正在尝试获取所有管理员的名字和姓氏的列表。
我的以下代码中有两个警告。我已经尝试在网上搜索了很多。
1) 查询是原始类型。对泛型 Query 的引用应该被参数化。
2) Query 类型的方法 list() 已弃用。
public List<Object> loadAllAdmins()
List<Object> allAdmins = new ArrayList<Object>();
try
HibernateUtil.beginTransaction();
Query q = currentSession.createQuery("SELECT admin.firstName, admin.lastName from AdminBean admin");
allAdmins= q.list();
HibernateUtil.commitTransaction();
catch (HibernateException ex)
System.out.println("List<AdminBean> loadAllPersons: HibernateException");
return allAdmins;
但是我在整个网络上都看到了这样的示例代码。我该如何解决这两个问题?
更新
我只是按照建议尝试使用 Criteria。它还说 list() 方法对于 Criteria 是不推荐的......似乎很多方法对于 Query 和 Criteria 都是不推荐的,包括 uniqueResult() 和其他......有什么建议我应该如何替换它们?
【问题讨论】:
也许检查 JavaDoc 中的给定类,可以有一个建议 - docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/query/… 。 【参考方案1】:public List<Admin> getAdmins()
List<Admin> AdminList = new ArrayList<Admin>();
Session session = factory.openSession();
for (Object oneObject : session.createQuery("FROM Admin").getResultList())
AdminList.add((Admin)oneObject);
session.close();
return AdminList;
警告来自“类型推断”。
我遇到了类似的问题。但是,我找到了一个没有“SuppressWarnings”的解决方案。
最近,我发现了一种无需类型推断即可编写相同代码的更短方法。
public List<Admin> getAdmins()
Session session = factory.openSession();
TypedQuery<Admin> query = session.createQuery("FROM Admin");
List<Admin> result = query.getResultList();
session.close();
return result;
希望对你有帮助。
【讨论】:
这似乎与我的回答中所述的程序相同,但显式转换除外,不是吗?显式地转换每个对象不是运行时的不利条件吗(参见***.com/questions/2170872/…)? 1.不,正如我所说,抑制警告已被删除。 2. 是的,但我认为这是值得的。通常值得尝试找出一种避免警告而不是抑制警告的方法。【参考方案2】:不要从org.hibernate
导入QUERY
(现在已弃用)。而是从“org.hibernate.query”导入。Eclipse reference
【讨论】:
【参考方案3】:我测试了hibernate javadoc 的其他方法,我想出了TypedQuery<T>
接口的getResultList()
方法。示例:
public List<Admin> getAdmins()
Session session = factory.openSession();
@SuppressWarnings("unchecked")
List<Admin> result = session.createQuery("FROM Admin").getResultList();
session.close();
return result;
区别在于createQuery
的返回类型不是Query
而是一个名为TypedQuery<T>
的子接口。因为它是typed,它还修复了“Query is a raw type”警告。
使用此解决方案,您可能会收到 Type Safety 警告,这可以通过显式强制转换每个对象或添加 @SuppressWarnings("unchecked")
关于标准见hibernate user guide
不过,我想知道为什么hibernate的教程页面没有调整。
【讨论】:
这个方法太不推荐了!createQuery()
未被弃用,getResultList()
未被弃用。请参阅docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/query/…。【参考方案4】:
你尝试过使用标准吗?
看那个例子:
public List<NoteVO> listNotes()
Session session = HibernateSessionFactory.getSession();
Criteria crit = session.createCriteria(NoteVO.class);
List<NoteVO> listNotes = crit.list();
session.close();
return listNotes;
【讨论】:
是的,我刚试过。它还说 list() 方法对于 Criteria 也是不推荐使用的......似乎“所有方法”对于 Query 和 Criteria 都是不推荐使用的,包括 uniqueResult() 和其他......我不知道为什么这会永远发生。我做了和所有在线教程完全一样的事情。createCriteria()
在 Hibernate 5.2 中是 @Deprecated
。【参考方案5】:
根据Hibernate Create Query,有两种createQuery()
方法:
Query createQuery(java.lang.String queryString )
为给定的 HQL/JPQL 查询字符串创建一个 Query 实例。
<R> Query<R> createQuery(java.lang.String queryString, java.lang.Class<R> resultClass)
为给定的 HQL/JPQL 查询字符串创建一个类型化的 Query 实例。
在您的情况下,您使用了第一个 Query
和 list() 方法是 @deperecated
。
您可以使用getResultList()
而不是list()
获得多个结果:
List<Object> loadAllAdmins()
List<Object> allAdmins = new ArrayList<Object>();
try
HibernateUtil.beginTransaction();
allAdmins= List<Object> currentSession.createQuery("SELECT admin.firstName, admin.lastName from AdminBean admin").getResultList();
HibernateUtil.commitTransaction();
catch (HibernateException ex)
System.out.println("List<AdminBean> loadAllPersons: HibernateException");
return allAdmins;
对于单个结果,您可以使用 getSingleResult()
:
Admin= (Object) currentSession.createQuery("SELECT admin.firstName, admin.lastName from AdminBean admin").getSingleResult();
PS:我根据你的类型使用Object
Object
,你可以根据使用的类型转换结果。
【讨论】:
【参考方案6】:虽然迟到了,但可能值得注意的是重载的 createQuery 方法(完全避免警告):
public List<Admin> loadAllAdmins()
try
HibernateUtil.beginTransaction();
List<Admin> admins = currentSession.createQuery("SELECT admin.firstName, admin.lastName from AdminBean admin", Admin.class).getResultList();
HibernateUtil.commitTransaction();
return admins;
catch (HibernateException ex)
System.out.println("List<AdminBean> loadAllPersons: HibernateException");
return new ArrayList<>();
【讨论】:
以上是关于Hibernate 5.2 版本 -> 很多查询方法已弃用?的主要内容,如果未能解决你的问题,请参考以下文章
基于struts2.5.2+hibernate5.2.2+spring4.3.2搭建SSH框架
Hibernate 4.3 到 5.2 升级 - 不能同时获取多个包
Glassfish 4.1 + Hibernate 5.2 连接