Hibernate には HQL クエリ構文があります。しかし、私たちは SQL ステートメントの方がよく知っているので、Hibernate で SQL をサポートするにはどうすればよいでしょうか?これについては考える必要はありません。Hibernate チームはすでにそれを行っています。
早速、例を挙げてみましょう。
select * from t_user usr
上記は SQL ステートメントですが、誰もがそれを知っています。 Hibernate にこのステートメントを実行させたいのですが、どうすればよいでしょうか?コードを見てください:
Query 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(); }
、自分自身が彼女自身に彼女自身が彼女に彼女を彼女に彼女が彼女に彼女が彼女自身と一緒にいることを彼女に彼女は彼女に彼女を彼女に言いました、と彼女は言いました。はい、それはオブジェクト指向ですが、残念ながら、方法はありません。
私たちは引き続き見ます: reselect {usr.*} from t_user usr
これを見ると、一部の子供たちの靴がチキンを動かし始めたと推定されます、その大きなブラケットは何ですか?
焦らず、ゆっくり時間をかけてください。まずはコードを見ていきましょう。
Query query = session.createSQLQuery("select {usr.*} from t_user usr").addEntity(TUser.class);
以前との違いは、addEntity を追加したことです。これは何を意味しますか?
API に直接アクセスすると、次のような一連の説明が表示されました:addEntity SQLQuery addEntity(String tableAlias, Class entityType) Declare a "root" entity Parameters: tableAlias - The SQL table alias entityType - The java type of the entity to add as a root
同じものではありませんが、もったいないです。自分だけが使用できます。
最初のパラメータはテーブルのエイリアスを参照します。上記のステートメントと同様に、テーブルのエイリアスは usr であるため、最初のパラメータは usr で、2 番目のパラメータはクエリ結果をマッピングする必要があるクラスを参照します。ここでは、TUser をマッピング ファイルの t_user テーブルにマップしているため、当然、ここには TUser があります。それで確認すると SQL 文が出てきて、結果は TUser 型でした。
org.hibernate.tutorial.domain6.TUser@198cb3d
もちろん、あなたのものは私のものとは異なるはずです。動かないで下さい。
select u.id as {usr.id},u.name as {usr.name},u.age as {usr.age} from t_user u
フィールドのエイリアスを指定するために as を使用していることがわかりますが、プログラムはまだです。同じ:
rreee
一部のチームは、構成ファイルを必要とするコード内に SQL ステートメントを記述しないことを規定していることを前に述べました。
設定ファイルに追加できます:
Query query = session.createSQLQuery("select u.id as {usr.id},u.name as {usr.name},u.age as {usr.age} from t_user u").addEntity("usr",TUser.class);
ここでのエンティティ名は完全なパッケージ名である必要があることに注意してください。そうしないと、エラーが報告されます。ここにはサブタグ return があり、テーブルのエイリアスとクラス名を指定するため、実行時に addEntity を行う必要がありません。
コードを見てください:
<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>
これを実行しましょう。主に構成ファイル内の構成が原因で、addEntity を追加しなかったことに注意してください。
エイリアスを持つテーブルについて長い間話してきましたが、テーブルにエイリアスがなく、返された結果をオブジェクトにカプセル化したい場合はどうすればよいでしょうか。
Query query = session.getNamedQuery("queryTUser"); query.setParameter("name","shun"); List list = query.list(); Iterator iter = list.iterator();
session.save およびその他の対応するデータ操作メソッドを呼び出すと、それは Hibernate の組み込み SQL ステートメントに変換されますが、SQL ステートメントの形式を自分で制御したい場合はどうすればよいでしょうか?
Hibernate も実際にそれを考えました。
これをマッピング ファイルに直接追加します:
select * from t_user usr
<sql-insert> INSERT INTO T_USER (NAME,AGE) values (?,?) </sql-insert> <sql-update> UPDATE USER SET USER_NAME=?,AGE=? WHERE uSER_ID=? </sql-update>
save を呼び出すと、hibernate のステートメントは次のようになります:
Hibernate:
User user = new User(); user.setName("shun123123"); user.setAge(23);
これは、設定した sql-insert タグ内のステートメントを呼び出します
戻りましょうupdate 呼び出しを見てください:
INSERT INTO USER(USER_NAME,AGE) values(?,?)
save を呼び出すと、自動的に update が呼び出されます:
Hibernate:
User user = (User)session.get(User.class,new Long(29)); user.setName("shun123123"); user.setAge(23); session.save(user);
出力ステートメントが大文字であることがわかります。つまり、構成ステートメントと呼ばれます。
Java の Hibernate フレームワークで SQL ステートメントを使用する簡単な紹介に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。