HibernateにはHQLクエリ構文があります。しかし、私たちがもっとよく知っているのは、SQLステートメントをカウントすることです。では、どのようにして冬眠サポートSQLを作成する必要がありますか?これを考慮する必要はありません、Hibernateチームはすでにそれを行っています。
ナンセンスについて話さないでください、例を見てください。
[t_user usrから]を選択します
上記はSQLステートメントであり、それはナンセンスであり、誰もが知っています。 Hibernateがこのステートメントを実行したい場合はどうすればよいですか?コードを見てください:
クエリquery = session.createsqlquery( "select * from t_user usr");
それだけです、誰もが何が残っているのかを知っている必要があり、何が起こっているのかは正常です。
次に、クエリの後に何が返されますか?
while(iter.hasnext()){object [] objs =(object [])iter.next(); for(int i = 0; i <objs.length; i ++){system.out.print(objs [i]); } system.out.println(); }返される各結果はオブジェクト[]配列です。
この時点で、誰かが出てきて、それがオブジェクト指向であると言いました。はい、それはオブジェクト指向です、悲しいかな、方法はありません。
見続けましょう:
t_user usrから{usr。*}を選択しますこれを見て、私はいくつかの子供の靴が動き始めていると思います。ブレースは何ですか?
心配しないで、時間をかけてください。最初にコードを読み続けましょう。
コードコピーは次のとおりです。
クエリquery = session.createsqlquery( "select {usr。*} from t_user usr")。addentity(tuser.class);
addentitySqlquery addentity(string tablealias、class entityType)「ルート」entityParameters:tablealias -tablealias -sql table aliasentitytype-ルートとして追加するエンティティのJavaタイプ
それはそれと同じです、それはわずかな吸うです。自分でしか使用できません。
最初のパラメーターは、テーブルのエイリアスを指します。上記のステートメントと同じように、私たちのテーブルのエイリアスはUSRであるため、最初のパラメーターはUSRであり、2番目のパラメーターはクエリの結果をマッピングする必要があるクラスを指します。ここでは、マッピングファイルのTuserを介してT_Userテーブルにマッピングされるため、もちろんここにはTUSERがいます。その後、チェックした後、SQLステートメントがあり、結果はTUSERタイプのものです。
私たちが見つけた結果は次のとおりです。
org.hibernate.tutorial.domain6.tuser@198cb3d
もちろん、あなたは私のものとは違うに違いありません。鶏肉を動かさないでください。
たぶん、私たちはすべてを見つける必要はないかもしれません、現時点では、私たちが必要とするのはエイリアスを設定することだけです:
{usr.id}、u.name as {usr.name}、u.age as {usr.age} from t_user uを選択しますフィールドのエイリアスを指定するために使用したことがわかりますが、プログラムでも同じことが言えます。
コードコピーは次のとおりです。
クエリquery = session.createsqlquery( "selece u.id as {usr.id}、u.name as {usr.name}、u.age as {usr.age} from t_user u")。
<sql-query name = "querytuser"> <return alias = "usr" entity-name = "org.hibernate.tutorial.domain6.tuser" /> select {usr。*} from t_user usr where name =:name < /sql-query>ここのエンティティ名は完全なパッケージ名で記述する必要があることに注意してください。そうしないと、エラーが報告されます。ここでは、サブタイトルの返品があります。これは、テーブルのエイリアスとクラス名を指定するため、実行時に追加する必要はありません。
コードを見てください:
クエリquery = session.getNamedQuery( "querytuser"); query.setParameter( "name"、 "shun");リストリスト= query.list(); iterator iter = list.iterator();
このように大丈夫です。主に構成ファイルの構成のために、追加を追加していないことに注意してください。
構成ファイルで構成されている場合、テーブルエイリアスとクラス名を指定するには、return Subtagが必要であることに注意してください。これは、主に声明を読むときに繰り返される判断を避けます。
長い間それについて話した後、私たちはエイリアスのテーブルについて話してきました。それで、私たちのテーブルにエイリアスがない場合はどうすればよいですか?
[t_user usrから]を選択します
とても簡単です。 AddentityのオーバーロードメソッドAddentity(クラスClazz)を呼び出すだけで、テーブルエイリアスなしでクラス名を提供する必要があります。
もちろん、Hibernateはストアドプロシージャもサポートしています。現在と呼ばれるストアドプロシージャと呼ばれることを示すために、構成ファイルでSQL-Queryの呼び出し可能なプロパティをTrueに設定する必要があります。ストアドプロシージャとはあまり接触していないので、将来それらをもっと勉強してから、あなたと一緒に勉強します。
session.saveなどのデータ操作の対応する方法を呼び出すと、Hibernateの組み込みSQLステートメントに変換されますが、SQLステートメントの形式を自分で制御する場合はどうでしょうか。
Hibernateも実際にそれを考えました。
マッピングファイルに直接追加します。
<sql-insert> t_user(name、age)values(?、?)</sql-insert> <sql-update> update user set user_name =?、age =? user_id =? </sql-update>
これは、字幕としてクラスタグに追加する必要があることに注意してください。私たちは皆、冬眠のデフォルトステートメントと区別するために、ここではすべて大文字であり、他の意味はありません。
まず、挿入する呼び出しを見てみましょう。
user user = new user(); user.setname( "shun123123"); user.setage(23);
Saveを呼び出すと、Hibernateステートメントは次のとおりです。
Hibernate:
user(user_name、age)values(?、?)に挿入
設定したSQL-Insertタグのステートメントを呼び出します。更新するための呼び出しを見てみましょう。
ユーザーユーザー=(user)session.get(user.class、new long(29)); user.setname( "shun123123"); user.setage(23); session.save(user);
Saveを呼び出し、自動的に更新を呼び出します。この時点の声明は次のとおりです。
Hibernate:
ユーザーを更新しますuser_name =?、age =? user_id =?出力ステートメントが大文字であることがわかります。つまり、構成されたステートメントが呼び出されます。