私は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の両方に対して非推奨であると思われます。
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;
}
それが役に立てば幸い。
QUERY
をorg.hibernate
からインポートしないでください(現在廃止予定)。代わりに、「org.hibernate.query」からインポートします。 Eclipse reference
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ユーザーガイド を参照してください
それにもかかわらず、私は、休止状態のチュートリアルページが調整されない理由を疑問に思っています。
使用基準を試しましたか?
その例を参照してください。
public List<NoteVO> listNotes() {
Session session = HibernateSessionFactory.getSession();
Criteria crit = session.createCriteria(NoteVO.class);
List<NoteVO> listNotes = crit.list();
session.close();
return listNotes;
}
パーティーには遅れましたが、オーバーロードされた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 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
を使用しました。使用したタイプに応じて結果をキャストできます。