【问题标题】:Hibernate 5.2 version -> A lot of Query methods deprecate?Hibernate 5.2 版本 -> 很多查询方法已弃用?
【发布时间】: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() 和其他......有什么建议我应该如何替换它们?

【问题讨论】:

标签: java sql hibernate hql dao


【解决方案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;
}

希望对你有帮助。

【讨论】:

  • 这似乎与我的回答中所述的程序相同,但显式转换除外,不是吗?显式地转换每个对象不是运行时的不利条件吗(参见stackoverflow.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的教程页面没有调整。

    【讨论】:

    【解决方案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<>();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2019-04-15
        • 2021-11-15
        • 2014-08-29
        • 2017-06-10
        • 2022-01-14
        • 2018-07-31
        • 2020-07-29
        • 1970-01-01
        • 2016-06-08
        相关资源
        最近更新 更多