Hibernate 5.2 版本 -> 许多查询方法弃用?
Hibernate 5.2 version -> A lot of Query methods deprecate?
我是 Hibernate 新手。
我正在尝试获取所有管理员的名字和姓氏列表。
我的以下代码中有两个警告。我已经试着在网上搜索了很多。
1) 查询是原始类型。对泛型查询的引用应该参数化。
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() 和其他方法...我应该如何替换它们有什么建议吗?
你试过使用标准吗?
查看示例:
public List<NoteVO> listNotes() {
Session session = HibernateSessionFactory.getSession();
Criteria crit = session.createCriteria(NoteVO.class);
List<NoteVO> listNotes = crit.list();
session.close();
return listNotes;
}
我测试了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的tutorials-page没有调整。
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;
}
警告来自 "Type Inference"。
我遇到了类似的问题。但是,我找到了没有 "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;
}
希望对您有所帮助。
不要从 org.hibernate
导入 QUERY
(现在已弃用)。而是从“org.hibernate.query”导入。Eclipse reference
根据 Hibernate Create Query ,有两种类型的 createQuery()
方法:
Query createQuery(java.lang.String queryString )
为给定的 HQL/JPQL 查询字符串创建一个查询实例。
<R> Query<R> createQuery(java.lang.String queryString,
java.lang.Class<R> resultClass)
为给定的 HQL/JPQL 查询字符串创建类型化查询实例。
在你的例子中,你使用了第一个 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
,你可以根据使用的类型转换结果.
虽然迟到了,但可能值得注意重载的 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 新手。
我正在尝试获取所有管理员的名字和姓氏列表。
我的以下代码中有两个警告。我已经试着在网上搜索了很多。
1) 查询是原始类型。对泛型查询的引用应该参数化。
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() 和其他方法...我应该如何替换它们有什么建议吗?
你试过使用标准吗?
查看示例:
public List<NoteVO> listNotes() {
Session session = HibernateSessionFactory.getSession();
Criteria crit = session.createCriteria(NoteVO.class);
List<NoteVO> listNotes = crit.list();
session.close();
return listNotes;
}
我测试了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的tutorials-page没有调整。
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;
}
警告来自 "Type Inference"。
我遇到了类似的问题。但是,我找到了没有 "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;
}
希望对您有所帮助。
不要从 org.hibernate
导入 QUERY
(现在已弃用)。而是从“org.hibernate.query”导入。Eclipse reference
根据 Hibernate Create Query ,有两种类型的 createQuery()
方法:
Query createQuery(java.lang.String queryString )
为给定的 HQL/JPQL 查询字符串创建一个查询实例。
<R> Query<R> createQuery(java.lang.String queryString, java.lang.Class<R> resultClass)
为给定的 HQL/JPQL 查询字符串创建类型化查询实例。
在你的例子中,你使用了第一个 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
,你可以根据使用的类型转换结果.
虽然迟到了,但可能值得注意重载的 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<>();
}
}