2012-02-23 9 views
4

は現在、私は1つのDAOは、それが一般的な方法を使用し、(私は後でより複雑なもののためにサブクラス化する予定)ほぼすべての私のデータアクセスを実行するための基準を休止しているので、右に感じます、それは次のようになります。ジェネリックDAOメソッドが間違っているが、それは

public <T> List<T> getAll(final Class<T> type){ 
    final Session session = sessionFactory.getCurrentSession(); 
    final Criteria crit = session.createCriteria(type); 
    return crit.list(); 
} 

public <T> List<T> getFieldEq(final Class<T> type, final String propertyName, final Object value){ 
    final Session session = sessionFactory.getCurrentSession(); 
    final Criteria crit = session.createCriteria(type); 
    crit.add(Restrictions.eq(propertyName, value)); 
    return crit.list(); 
} 

しかし、HQLは、それがデータベース/接続することで最適化できるよう好適である(つまり、クエリをパラメータ化)、基準APIは、実行時に評価する必要がある一方で、そうRestrictions.eq("name", "NimChimpksy")がで安全なエラーではありませんすべて。

は、私は(それが唯一のDAOを持っていていい感じ)ジェネリックDAOを維持するか、単に共通のインタフェースを実装し、私のドメインオブジェクトごとに別々のDAOでHQLを使用する必要があります。

+0

準備されたステートメントに関するHQLと基準の間に違いはありません。どちらも準備済みのステートメントを使用します。私は、どのように制限がエラーセーフではないかは分かりません。 –

+0

@JBNizet実行時まで制限が評価されないのに対し、デプロイ時にhqlがチェックされるのはなぜですか?私は私が持っている別の答えを参照しています:http://stackoverflow.com/questions/9380883/hibernate-criteria-multiple-table-joins – NimChimpsky

+0

実行時にHQLもチェックされます。名前付きクエリはデプロイ時にチェックされますが、それが正しいことを意味するものではありません。エラーが発生しないようにするには、DAOの単体テストを実装します。その後、ビルド時にすべてがチェックされます。 –

答えて

3

あなたの現在のアプローチにはまったく問題はありませんが、これは簡単で簡単です。

通常、少なくとも私のチームでは、基準対HQLを使用しての選択は、「好み」の事の詳細です。 HQLはSQLによく似ており、より圧縮されたコードを書くことができます。条件によっては、一部の開発者にとってより多くのOOが必要になります。私の場合は

、私はそれは私が複雑なクエリのためにはるかに短いとクリーンなコード(再び、それは本当に好みの問題ですが、私は信じている)を書くことができますので、HQLを使用する傾向があります。あなたはこののように何かをした場合

public void doIt(String s1, String s2, String s3){ 
    ... 

    if (/*some s1 condition*/) { 
     crit.add(Restrictions.eq("s1", s1)); 
    } 

    if (/*some s2 condition*/) { 
     crit.add(Restrictions.like("s2", s2 + "%")); 
    } 

    if (/*some s3 condition*/) { 
     crit.add(Restrictions.ne("s3", s3)); 
    } 

    return crit.list(); 
} 

想像 - :しかし、基準はそれがHQLより全体の多くに簡単に飛ぶ上のクエリ条件を構築するために私にできるので、ここでは非常に単純な例だが、あまりにも非常に便利ですHQLでは、HQLクエリ文字列を動的に構築しなければならないため、コードを読みにくくすることができます。

0

私は基本的なHibernateの取得、保存、更新、削除のすべての操作に静的なクラスを使用しています。これはかなりうまく動作します。

public static List getList(Class c, Session session) 
{ 
    return session.createQuery("FROM " + c.getSimpleName()).list(); 
} 
関連する問題