hibernate関連クエリー


多くの人はhibernateが複数のテーブルクエリーに触れると不便で、元の音sqlで解決するしかないと思っていますが、実はそうではありません.hql文は実はすでに強く、基本的にsqlの60%の機能をカバーしています.原生sqlを使うシーンは以下のような状況だと思います.
1.非常に複雑なsql(ネスト、テンポラリ・テーブル、混合文【updateはselectネストを含む】)
2.oracleなどのデータベースのプロパティ関数
3.特殊業務sql、すなわちクエリされた結果は、poエンティティクラスのフィールドではなく、ある特殊業務の意味である.例:select col_1 as business1, col_2 as business2 from table;(ビジネス1はtableのフィールドではありません)
以上の特殊な需要を除いて、私はhqでhqlを使うことを提案して、hqlの最大の利点、po実体クラスに自動的にマッピングすることができる以外に、もう一つはデータベースにまたがる汎用性で、hql文を採用して簡単にデータベースをmysqlからoracleに変えることができます.
hqlの基礎はもう述べません.今日は主にマルチテーブル間の関連クエリーを紹介します.
1.po間に関連関係を含む
public class Student {
	...
	
	private Clazz clazz;
	
	get()...
	set()...
}

from Student t inner join t.clazz r where t.sex='男'and r.name='三組'
この文はデフォルトでは、怠け者でロードされます.一緒にキャプチャしたい場合は、文は次のようになります.
from Student t inner join fetch t.clazz r where t.sex='男'and r.name='三組'
hqlはleft joinやright joinなどの関連クエリーもサポートしています
2.po間に関連関係がない
public class Student {
	...
	
	private String clazzId;
	
	get()...
	set()...
}

select t from Studnent,Clazz r where t.clazzId=r.id and t.sex='男'and r.name='三組'
3.クエリー部分フィールド
また、poオブジェクトの一部のフィールドをクエリーするだけで済む場合もありますが、どうやって調べますか?
select new Student(name, sex) from Student
ただし、Studentエンティティクラスには、パラメータがname,sexの構造関数が必要であることに注意してください.
4.統計関数
count()、min()、max()、sum()、avg()などをサポート
select avg(s.age) from Student as s
5.重複行の除去
select distinct s.age from Student as s
6.総合用法
典型的な例を挙げると、ページ分けです.hibernateでページを分けて、今多くの人はやはり2つのステップを採用して、第1歩は行数を統計して、第2歩はページを分けて検索して(全体のページ数を計算することを目的とします)、一歩で完成したいならば、多くの人はやはりsqlを使って、実はhqlもできます.
select new Student(t.name, t.sex, count(t)) from Sudent t
Studentエンティティークラスではパラメータがname,sex,rowCountのコンストラクション関数があればよいが,rowCountはデータベース内のフィールドでなくてもよい
 
以上から分かるように、ある技術は私たちが時々不便だと思っていますが、私たちはまだそれを理解していないので、もっとよく探求し、掘り起こす必要があります.