web-dev-qa-db-ja.com

Hibernate 5.2バージョン->多くのQueryメソッドは非推奨ですか?

私はHibernateが初めてです。

すべての管理者の名と姓のリストを取得しようとしています。

次のコードには2つの警告があります。私はすでに多くのオンラインで検索しようとしました。

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

しかし、私はこのようなサンプルコードをウェブ全体で見ています。これら2つの問題をどのように解決すればよいですか?

更新

提案されたとおりにCriteriaを使用しようとしました。また、list()メソッドはCriteriaに対して非推奨であると述べています... uniqueResult()などを含む多くのメソッドがQueryとCriteriaの両方に対して非推奨であると思われます。

13
Chenya Zhang
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;
}

それが役に立てば幸い。

13
Pika

QUERYorg.hibernateからインポートしないでください(現在廃止予定)。代わりに、「org.hibernate.query」からインポートします。 Eclipse reference

12
Aniket Warey

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 raw type」警告も修正します。

このソリューションを使用すると、Type Safety警告が表示される場合があります。これは、各オブジェクトを明示的にキャストするか、@SuppressWarnings("unchecked")を追加することで解決できます

基準については hibernateユーザーガイド を参照してください

それにもかかわらず、私は、休止状態のチュートリアルページが調整されない理由を疑問に思っています。

3
Johannes H

使用基準を試しましたか?

その例を参照してください。

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

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

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

    session.close();
    return listNotes;
}
0
A. Horst

パーティーには遅れましたが、オーバーロードされた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<>();
    }
}
0
sharmaap

Hibernate Create Query によると、2つのタイプの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を使用しました。使用したタイプに応じて結果をキャストできます。

0