我是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。它还说,对于Criteria,list()方法是弃用的...似乎很多方法都被弃用了Query和Criteria,包括uniqueResult()和其他...任何建议我应该如何替换它们?
答案 0 :(得分:13)
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;
}
希望它有所帮助。
答案 1 :(得分:12)
不要从QUERY
导入org.hibernate
(因为现在已弃用)。而是从“org.hibernate.query”导入。Eclipse reference
答案 2 :(得分:3)
我测试了hibernate javadoc的其他方法,我提出了getResultList()
接口的TypedQuery<T>
方法。例如:
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>
的子接口。因为它是类型,它还修复了&#34;查询是原始类型&#34;警告。
使用此解决方案,您可能会收到类型安全警告,可以通过明确地投射每个对象或添加@SuppressWarnings("unchecked")
关于标准,请参阅hibernate user guide
然而,我想知道为什么没有调整hibernate的教程页面。
答案 3 :(得分:0)
您是否尝试过使用标准?
见例子:
public List<NoteVO> listNotes() {
Session session = HibernateSessionFactory.getSession();
Criteria crit = session.createCriteria(NoteVO.class);
List<NoteVO> listNotes = crit.list();
session.close();
return listNotes;
}
答案 4 :(得分:0)
根据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
,您可以根据使用的类型投射结果。
答案 5 :(得分:0)
虽然晚会很晚但可能值得注意重载的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<>();
}
}