Hibernate 5.2版本 - >很多Query方法都弃用了?

时间:2016-07-19 14:01:58

标签: java sql hibernate hql dao

我是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()和其他...任何建议我应该如何替换它们?

6 个答案:

答案 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<>();
    }
}