Hibernate 5.2 版本 -> 很多查询方法已弃用?

Posted

技术标签:

【中文标题】Hibernate 5.2 版本 -> 很多查询方法已弃用?【英文标题】:Hibernate 5.2 version -> A lot of Query methods deprecate? 【发布时间】:2016-11-22 11:31:44 【问题描述】:

我是 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。它还说 list() 方法对于 Criteria 是不推荐的......似乎很多方法对于 Query 和 Criteria 都是不推荐的,包括 uniqueResult() 和其他......有什么建议我应该如何替换它们?

【问题讨论】:

也许检查 JavaDoc 中的给定类,可以有一个建议 - docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/query/… 。 【参考方案1】:
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;

希望对你有帮助。

【讨论】:

这似乎与我的回答中所述的程序相同,但显式转换除外,不是吗?显式地转换每个对象不是运行时的不利条件吗(参见***.com/questions/2170872/…)? 1.不,正如我所说,抑制警告已被删除。 2. 是的,但我认为这是值得的。通常值得尝试找出一种避免警告而不是抑制警告的方法。【参考方案2】:

不要从org.hibernate 导入QUERY(现在已弃用)。而是从“org.hibernate.query”导入。Eclipse reference

【讨论】:

【参考方案3】:

我测试了hibernate javadoc 的其他方法,我想出了TypedQuery&lt;T&gt; 接口的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&lt;T&gt;的子接口。因为它是typed,它还修复了“Query is a raw type”警告。

使用此解决方案,您可能会收到 Type Safety 警告,这可以通过显式强制转换每个对象或添加 @SuppressWarnings("unchecked")

来解决

关于标准见hibernate user guide

不过,我想知道为什么hibernate的教程页面没有调整。

【讨论】:

这个方法太不推荐了! createQuery() 未被弃用,getResultList() 未被弃用。请参阅docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/query/…。【参考方案4】:

你尝试过使用标准吗?

看那个例子:

public List<NoteVO> listNotes() 
    Session session = HibernateSessionFactory.getSession();

    Criteria crit = session.createCriteria(NoteVO.class);

    List<NoteVO> listNotes = crit.list();

    session.close();
    return listNotes;

【讨论】:

是的,我刚试过。它还说 list() 方法对于 Criteria 也是不推荐使用的......似乎“所有方法”对于 Query 和 Criteria 都是不推荐使用的,包括 uniqueResult() 和其他......我不知道为什么这会永远发生。我做了和所有在线教程完全一样的事情。 createCriteria() 在 Hibernate 5.2 中是 @Deprecated【参考方案5】:

根据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:我根据你的类型使用ObjectObject,你可以根据使用的类型转换结果。

【讨论】:

【参考方案6】:

虽然迟到了,但可能值得注意的是重载的 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 5.2 版本 -> 很多查询方法已弃用?的主要内容,如果未能解决你的问题,请参考以下文章

基于struts2.5.2+hibernate5.2.2+spring4.3.2搭建SSH框架

Hibernate 4.3 到 5.2 升级 - 不能同时获取多个包

Glassfish 4.1 + Hibernate 5.2 连接

使用 Hibernate 5.2 以流形式查询结果

spring4整合hibernate5以及出现的问题解决办法

Wordpress网站 - php版本迁移(5.2 - 7.x) - 它会导致问题吗?