ハイベルナーまとめ(三)


8.hql検索
  ハイベルナー・query laggage。hql検索では、キーワードは大文字と小文字を区別しませんが、クラスと属性は大文字と小文字を区別します。
  1.簡単な属性クエリ。
  単一の属性クエリは、属性の結果セットのリストに戻り、要素タイプとエンティティタイプの対応するタイプが一致します。
List students = session.createQuery("select name from Student").list();

for (Iterator iter=students.iterator(); iter.hasNext();) {

String name = (String)iter.next();

System.out.println(name);

}
 
 //結果セットの属性リストを返します。要素タイプとエンティティタイプの属性タイプが一致します。
複数の属性クエリー、複数の属性クエリーは配列オブジェクトに戻り、オブジェクト配列の長さは属性の個数に依存し、オブジェクト配列の要素タイプはエンティティクラスの属性に一致します。
List students = session.createQuery("select id, name from Student").list();

for (Iterator iter=students.iterator(); iter.hasNext();) {

Object[] obj = (Object[])iter.next();

System.out.println(obj[0] + ", " + obj[1]);

}
 
2.エンティティオブジェクトクエリ
List students=session.reat Query(from Student).list()
もちろんこのhql文は別名を使ってもいいです。asは省略できます。例えば、from Student asはselectキーワードを使うなら、別名を使わなければなりません。select s from Student as.select*from Studentフォーマットはサポートされていません。
クエリにはlistとIterateの違いがあります。
リストクエリはクエリーを直接実行した結果ですので、sql文は一つしかありません。iterate方法はN+1のsql文を発生する可能性があります。これはどういうことですか?N+1の文を理解するには、まず、iterateがどのようにクエリを実行しているかを確認しなければなりません。
まず、クエリ対象IDの語句を発行し、対象のIDからキャッシュ(キャッシュの概念上のブログに記載されています)に検索します。このオブジェクトの他の属性があれば、Nつの語句が発行されます。このときのN文は、先ほど最初に検索したレコードの数です。この現象はN+1 sql文です。
リストはデフォルトでsql文を発行し、検索した結果はキャッシュに保存されますが、キャッシュは利用されません。入れても次の実行時にsql文を送り続けます。
iterateはデフォルトではキャッシュを利用しますが、キャッシュにあればN+1の文は出ません。
3.条件照会
この方法はパラメータを入力し、パラメータのプレースホルダを使用します。「:パラメータ名」も使用できます。
javaコードは以下の通りです
List students = session.createQuery("select s.id, s.name from Student s where s.name like ?")

.setParameter(0, "%0%")

.list();

List students = session.createQuery("select s.id, s.name from Student s where s.name like :myname")

.setParameter("myname",  "%0%")

.list();
 4.元のsql文を使う。
     私たちが最初に書いたsql文と同じです。ここでは紹介しません。
 5.外付けの名前のクエリー。
      これは難しそうですが、どうやって理解しますか?一般的にはhql文を外に書いてマッピングファイルに書くということです。使用ラベル:
   
<query name="queryStudent">

<![CDATA[

select s from Student s where s.id <?

]]>

</query>
 
    このラベルはプログラムでどう使いますか?session.get NameQuery()を使用して、値付けを行います。コードは以下の通りです。
List students = session.getNamedQuery("queryStudent")

.setParameter(0, 10)

.list();
 
 6.クエリーフィルタ。
    これはどういう意味ですか?フィルタはよく知っていますよね。よく知らない人は以前のブログを参考にしてもいいです。コードフィルタに接触したことがあります。コードフィルタは当時のページごとにコードフォーマットを設定する必要がないように提出しました。この検索フィルタも実はこの意味です。コードにsql文が必要なら、それを使うことも考えられます。毎回照会文を書かないようにします。
    使用すると、まずマップファイルにタグを設定します。
<filter-def name="testFilter">

<filter-param type="integer" name="myid"/>

</filter-def>
 
  その後、次の手順で使用し、値を付けます。
session.enableFilter("testFilter")

.setParameter("myid", 10);
7.別紙で照会する
    改ページで調べたら、これはきっとよくわかりません。drpプロジェクトをする時に一番多く作ったのは改ページで、その時にoracleデータベースを使って、改ページで調べて三階の入れ子に関連します。直接に入ってくるパラメータは、各ページのサイズ(記録数)、ページ番号です。
     Hybernateにはすでに封入されています。開始ページ番号と各ページの大きさを設定すればいいです。自動で手書きでネストされたsql文は不要です。
     コードは以下の通りです
List students = session.createQuery("from Student")

.setFirstResult(1)

.setMaxResults(2)

.list();
 
8.オブジェクトナビゲーションクエリ。
これはどういう意味ですか?これはクラスの属性に使うものであれば、他のクラスの参照です。例えば、studentクラスにはクラスSの属性があります。その中のクラスesもクラスクラスクラスクラスの引用です。
私達が調べた時はこのように使えます。
List students = session.createQuery("from Student s where s.classes.name like '%t%'")

.list();
s.get Class.get Name()は、そのままgetの後の属性を使って、アルファベット小文字で書く。
 この文法は、よく知っていますか?私たちはどこでも使ったことがありますか?思い出しましたか?推測できますよ。ふふ、JSTLの中です。もっと知りたいなら、私のブログを参考にしてもいいです。
9.クエリーに接続します
    接続は、内部接続と外部接続に分かれています。外部接続は左接続、右接続、完全接続に分かれています。これはデータベースの中の左右の接続と同じです。私達は分かりやすく説明します。
    左接続:左を基準として、右側は該当していなくても、この記録を調べます。この時はマッチしていない右側はnullで埋めます。
    右接続:右側を基準として、左側がマッチングしていなくても、この記録を調べます。この時は一致していない左側がnullで満たされます。
   完全接続:片方だけ存在すればいいです。
   内部接続:両方が存在してこそ、この記録を抽出することができます。
10.統計クエリ
     つまり、クエリのレコード数です。検索された額countはlongタイプです。
11.DMMスタイルの操作。
     DMM?実はDLL=Data Manipulate Language(データ操作言語)は、例を挙げます。
  
session.createQuery("update Student s set s.name=? where s.id<?")

.setParameter(0, "  ")

.setParameter(1, 2)

.executeUpdate(); 
           
もし元の名前が李四だったら、データベースを更新してから王斌になります。もしこの時データを取り出すなら、その名前は李四ですか?それとも王斌ですか?道理によっては王斌ですが、結果は確かに李四です。信じないなら、自分で実践してもいいです。
このため、データベースが更新されましたが、キャッシュに更新されていないため、このようなデータベースとキャッシュが同期されていないという問題があります。
だから、私達はできるだけこのような形式を使わないべきです。長さをあげて短いところを避けましょう。