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