は現在、私は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を使用する必要があります。
準備されたステートメントに関するHQLと基準の間に違いはありません。どちらも準備済みのステートメントを使用します。私は、どのように制限がエラーセーフではないかは分かりません。 –
@JBNizet実行時まで制限が評価されないのに対し、デプロイ時にhqlがチェックされるのはなぜですか?私は私が持っている別の答えを参照しています:http://stackoverflow.com/questions/9380883/hibernate-criteria-multiple-table-joins – NimChimpsky
実行時にHQLもチェックされます。名前付きクエリはデプロイ時にチェックされますが、それが正しいことを意味するものではありません。エラーが発生しないようにするには、DAOの単体テストを実装します。その後、ビルド時にすべてがチェックされます。 –