Hibernate 5.2版 – >很多Query方法都弃用了?
我是Hibernate的新手。
我正在尝试获取所有管理员的名字和姓氏列表。
我的以下代码中有两个警告。 我已经尝试在线搜索了很多。
1)查询是原始类型。 应该参数化对generics类型Query的引用。
2)不推荐使用Query类型的方法list()。
public List loadAllAdmins() { List allAdmins = new ArrayList(); 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 loadAllPersons: HibernateException"); } return allAdmins; }
但我在整个网络上都看到了这样的示例代码。 我该如何解决这两个问题?
更新
我只是尝试按照建议使用Criteria。 它还说,对于Criteria,list()方法是弃用的……看起来很多方法都被弃用了Query和Criteria,包括uniqueResult()和其他…任何建议我应该如何替换它们?
public List getAdmins() { List AdminList = new ArrayList (); Session session = factory.openSession(); for (Object oneObject : session.createQuery("FROM Admin").getResultList()) { AdminList.add((Admin)oneObject); } session.close(); return AdminList; }
警告来自“类型推断”。
我有类似的问题。 但是,我找到了没有“SuppressWarnings”的解决方案。
最近,我发现了一种更简单的方法来编写相同的东西而无需类型推断。
public List getAdmins() { Session session = factory.openSession(); TypedQuery query = session.createQuery("FROM Admin"); List result = query.getResultList(); session.close(); return result; }
希望能帮助到你。
不要从org.hibernate
导入QUERY
(因为它现在已弃用)。 而是从“org.hibernate.query”导入。 Eclipse参考
我测试了hibernate javadoc的其他方法,我想出了TypedQuery
接口的getResultList()
方法。 例:
public List getAdmins() { Session session = factory.openSession(); @SuppressWarnings("unchecked") List result = session.createQuery("FROM Admin").getResultList(); session.close(); return result; }
不同之处在于返回的createQuery
类型不是Query
而是一个名为TypedQuery
的子接口。 因为它是键入的 ,它还修复了“查询是原始类型”警告。
使用此解决方案,您可能会收到类型安全警告,可以通过显式转换每个对象或添加@SuppressWarnings("unchecked")
关于标准,请参阅hibernate用户指南
不过,我想知道为什么没有调整hibernate的教程页面。
你尝试过使用标准吗?
看那个例子:
public List listNotes() { Session session = HibernateSessionFactory.getSession(); Criteria crit = session.createCriteria(NoteVO.class); List listNotes = crit.list(); session.close(); return listNotes; }
根据Hibernate Create Query ,有两种类型的createQuery()
方法:
Query createQuery(java.lang.String queryString )
为给定的HQL / JPQL查询字符串创建Query实例。
Query createQuery(java.lang.String queryString, java.lang.Class resultClass)
为给定的HQL / JPQL查询字符串创建一个类型化的Query实例。
在您的情况下,您使用了第一个Query
和list()方法是@deperecated
。
您可以为多个结果使用getResultList()
而不是list()
:
List
对于单个结果,您可以使用getSingleResult()
:
Admin= (Object) currentSession.createQuery("SELECT admin.firstName, admin.lastName from AdminBean admin").getSingleResult();
PS:我根据您的Object
类型使用了Object
,您可以根据使用的类型转换结果。
虽然参加派对的时间较晚,但可能值得注意的是重载的createQuery方法(完全避免警告):
public List loadAllAdmins() { try { HibernateUtil.beginTransaction(); List 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 loadAllPersons: HibernateException"); return new ArrayList<>(); } }