SQLステートメントにあまり慣れていない米国のプログラマーにとって簡単な基準クエリについて話しましょう。
これ以上苦労せずに、例を見てみましょう。
エンティティクラスは次のとおりです。
パブリッククラスユーザーはSerializable {private static final long serialversionuid = 1l;パブリックロングID;プライベート文字列名;プライベートインクエイジ; // get/set method}マッピングファイルを書き込むことはありません。これは非常にシンプルなエンティティです。子供の靴がわからない場合は、Hibernateカテゴリの他の記事を参照してください。
次に、基準を使用して照会する方法を見てみましょう。
public static void main(string [] args){configuration cfg = new configuration()。configure(); SessionFactory SessionFactory = CFG.BuildSessionFactory();セッションセッション= sessionfactory.opensession();基準基準= session.createcriteria(user.class); criteria.add(restrictions.eq( "name"、 "shun"));リストlist = criteria.list(); iterator iter = list.iterator(); while(iter.hasnext()){user user =(user)iter.next(); System.out.println(user.getName()+":"+user.getage()); } session.close(); }コードを見ると、非常にシンプルな文字列です。
私たちは皆、以前のものに精通しており、セッションを構築した後にコードが表示されます。
基準基準= session.createcriteria(user.class); criteria.add(restrictions.eq( "name"、 "shun"));
コードのこれら2つの文が重要なポイントです。それが正確に何を意味するのかを分析しましょう。
最初の文では、セッションを通じて基準実装クラスのオブジェクトを取得し、2番目の文ではADDメソッドを介して条件を追加し、EQは平等を表します。 hibernate3は以前にexpression.eqを通じて実装されていました。 3以降、基準が放棄されたため、制限クラスを使用して式と同じです。 APIを見て、式が制限から継承されていることを見つけましょう。
上記の2つの文に戻って、これらのタスクを終えた後、冬眠は実際に私たちが同様の構築をするのに役立ちました
select * fromユーザーname = 'shun'
そのような声明。 (ここで、マッピングファイルのユーザークラスに対応するテーブルはユーザーテーブルであり、名前属性は名前フィールドに対応しています)
制限には、SQLステートメントの作成に役立つ多くの方法もあります。 APIをチェックした後は理解しやすいです。
上記のコードを再見てみましょう。セッションを閉じますが、この基準を使用し続けたい場合、それは大丈夫ですか?見てみましょう。
上記のコードの後、再発して、次のことを追加します。
List List2 = Criteria.list(); iterator iter2 = list.iterator(); while(iter.hasnext()){user user =(user)iter.next(); System.out.println(user.getName()+":"+user.getage()); }前のリストとITERの違いを区別するために、ここで別のリストを使用します。
それを実行すると、例外が得られます:
org.hibernate.sessionexception:セッションは閉じられています!
この例外を報告することは、セッションが閉じられていることを意味します。多くの場合、セッションを閉じた後、SaveorupDate、Saveなどに関連する操作を実行した後、同様の例外を報告します。
Hibernate3は当社のニーズを考慮し、セッションとは無関係に存在する可能性のある独立した墓地を実装します。
例を見てみましょう:(エンティティはまだ上にあります)
public static void main(string [] args){configuration cfg = new configuration()。configure(); SessionFactory SessionFactory = CFG.BuildSessionFactory();セッションセッション= sessionfactory.opensession(); Detchedcriteria decliteria = DetchedCriteria.ForClass(user.class); decriteria.add(restrictions.eq( "name"、 "shun"));リストリスト= decolteria.getExecutableeCriteria(session).list(); iterator iter = list.iterator(); while(iter.hasnext()){user user =(user)iter.next(); System.out.println(user.getName()+":"+user.getage()); } session.close();セッションsession2 = sessionfactory.opensession(); List List2 = decolteria.getExecutableCriteria(session2).list(); iterator iter2 = list2.iterator(); while(iter2.hasnext()){user user =(user)iter2.next(); System.out.println(user.getName()+":"+user.getage()); }}セッションが閉じられた後、別の接続で剥離布地を引き続き使用できることがわかります。 getExexecutable項(セッションセッション)を使用して、現在の剥離布地を特定のセッションに関連付ける必要があります。
次に、Subqueriesクラスと戸建ての組み合わせを見てみましょう。
public static void main(string [] args){configuration cfg = new configuration()。configure(); SessionFactory SessionFactory = CFG.BuildSessionFactory();セッションセッション= sessionfactory.opensession(); Detchedcriteria decliteria = DetchedCriteria.ForClass(user.class); decriteria.setProjection(projections.avg( "age"));基準基準= session.createcriteria(user.class); Criteria.Add(subqueries.propertygt( "age"、decliteria));リストlist = criteria.list(); iterator iter = list.iterator(); while(iter.hasnext()){user user =(user)iter.next(); System.out.println(user.getName()+":"+user.getage()); } session.close(); }質問がある最初のコード文は次のとおりです。
decriteria.setProjection(projections.avg( "age"));
このコードとは、減少を通じて年齢の平均値を取得することを指します。次に、以下の平均値を超える年齢のオブジェクトを取得します。
投影には、SQLメソッドを実装する多くのカプセル化方法が含まれています。 APIを見ることができます。
少し高度な使用法について学びましょう。
コードを見てください:
Criteria.setFirstreSult(10); Criteria.setMaxResults(20);
ここでは、最初の記録を第10条として設定し、第10条から20のレコードを見つけます。この慣行によれば、基本的なページング関数を実装できます。
もちろん、多くの場合、ソートが必要であり、基準もサポートしています。
Criteria.Addorder(order.desc( "age"));
ここでは、addorderメソッドを直接使用し、属性パラメーターを必要とするOrder.descを介してOrderオブジェクトを取得できます。実際、Addorderを呼び出すと、Hibernateは年齢ごとに順序を生成するのに役立ちます。
グループ化する必要がある場合、これをどのように行いますか?これには、前に言及したプロジェクションクラスのグラッポロパティ法が必要です。
criteria.setprojection(projections.groupproperty( "age"));
ここでは、年齢に対応する野外年齢を通じて実際にグループ化されている年齢属性に従ってグループ化します。 Hibernateは、Group By Ageのような声明に自動的に変換します。
投影には多くの実用的な方法があります(これは、Hibernate 3の後にのみ利用可能であることに注意してください)。