2012-01-31 8 views
57

私はHibernate 4を使用しており、テーブルのすべての行を単純にリストしたいと考えています。私が見つけたすべてのソリューションは、 "tablenameから"のようなものを使うことを提案していますが、文字列のテーブル名のハードコーディングを避けたいと思います。HQLなしでテーブルのすべての行を取得していますか?

答えて

130

あなたは、例えば

session.createCriteria(MyEntity.class).list(); 

を使用することができます。

+1

どのように私はこれを並べ替えることができますか? –

+14

session.createCriteria(MyEntity.class).addOrder(Order.asc( "age"))。list(); – slonik

+5

このタイプを安全にする方法はありますか? – Hassan

7

HQLはテーブル名を使用しません。エンティティ名を使用します。エンティティ名は(デフォルトで)クラス名です。だから、

String hql = "select a from " + TheEntity.class.getSimpleName() + " a"; 

を使用することができますしかし、私はここで型安全性に対する読みやすさを好む、とあなたはとにかくあなたのクエリのテストを自動化している必要があります

String hql = "select a from TheEntity a"; 

を使用します。

+0

はい、クエリがテストされていますが、あなたの第2の解決策はまだクエリがリファクタリングによって考慮されないことを意味します。 –

+1

はい、失敗したテストでキャッチされます。 –

+0

私は最終的に正しい結果を得ることが重要であることに同意しますが、プロジェクトが現在初期段階にあり、毎週リファクタリングが行われています。これを適切にサポートすることは、現時点では非常に重要です。 –

-2

//休止クラス

public class CommonDAO<T> { 

Session session = null; 
Transaction transaction = null; 
private Class<T> clazz; 

public CommonDAO(){ //constructor 
    session = HibernateUtil.getSessionFactory().openSession(); 
    transaction = session.beginTransaction(); 
    Type genericSuperclass = this.getClass().getGenericSuperclass(); 
    if (genericSuperclass instanceof ParameterizedType) { 
     ParameterizedType pt = (ParameterizedType) genericSuperclass; 
     Type type = pt.getActualTypeArguments()[0]; 
     clazz = (Class<T>) type; 
    } 
} 

public T listById(Object id) { 
    T object = null; 
    try { 
    object = (T) session.get(clazz, (Serializable) id); 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
    return object; 
} 
} 

//ユーザークラス

public class UserDAO extends CommonDAO<UserMaster> { // Here UserMaster is pojo 

public UserDAO() { 
    super(); 
} 

public static void main(String ar[]) { 
    UserMaster user = new UserDAO().listById(1); // 1 is id 
    System.out.println(user.getUserName()); 
} 
} 
+2

コンストラクタでセッションでこのようなことをしないでください – dikkini

+0

コンストラクタでセッションを使用しています!まったく良い練習ではありません。 – Krishna

+2

@dikkiniどうしてそうですか?それを私に説明してもらえますか? –

関連する問題