HibernateはHQL使用
何1.HQLこと?
HQL(Hibernateは クエリ 近い思考のオブジェクト指向の方法にSQL、HQLとは異なり、クエリデータに専用されている休止言語)文。
2.なぜHQLを使うのか?
JDBCにいくつかの欠点を使用してHQLクエリを使用しないでください。
複雑なSQL文、エンティティクラスのクエリとそのプロパティを記述する必要はありません。
クエリ結果がオブジェクトの一覧に直接格納されている、いないパッケージを再度;
自動的に別のSQLステートメントの異なるデータベースを生成するため、データベースの独立は、設定Hibernateの方言の属性に応じて実行しました。
3.HQL構文
【選択/更新/削除...]エンティティ[...]から[有する......] [グループ......により] [順序によって......]。
[注]:HQL文のキーワードは大文字小文字を区別しないのですが、エンティティクラスとオブジェクトのプロパティは、大文字と小文字が区別されます。
4.テストJUnitテストクラスHQL
例1:
公共 ボイドhql1(){ 文字列HQL = "TeacherEntity tから選択T" 。 // 创建查询对象 クエリのクエリ= session.createQuery(HQL)。 // 执行查询 一覧の<Object>リスト= query.list(); 用{(リストオブジェクトobj) のSystem.out.println(((TeacherEntity)OBJ).getTeacherName() + "/" + ((TeacherEntity)OBJ).getTeacherClass())。 } } @Test 公共 ボイドhql2(){ 文字列HQL = "TeacherEntityから" 。 リスト<TeacherEntity>リスト= session.createQuery(HQL).LIST(); 用{(リストTeacherEntity T) のSystem.out.println(t.getTeacherName() + "/" + t.getTeacherClass())。 } }
これらの2つの結果が同じになります。
、書き込み選択しないでください(1)どのような状況下で
、我々のクエリは、すべてのプロパティTeacherEntityあるとき、私たちは書込み選択することはできません。例えば:TeacherEntityから、コースも書き込まれるが、フォーマットに変更されるの:(AS)TeacherEntityから選択T ; T 括弧書き込まれないかもしれないのように書くことができます。
(2)どのような状況下では、書き込みが選択し
、我々はもはやクエリされていないときに、すべての人が、私たちは選択の上に書かなければならない属性。以下のような:ときに我々クエリTeacherEntity名とクラス属性、我々は書き込みに持っているので:選択t.name、TeacherEntity tからt.class ; することができません別名:選択名、クラスTeacherEntityから。
(3)は、クエリの結果は、オブジェクトによって受信されるオブジェクトである場合、受信側エンティティであってもよいです。
例2:
@Test 公共 ボイドhql3(){ 文字列HQL = "teacherName = TeacherEntityから?" 。 一覧 <TeacherEntity>リスト= session.createQuery(HQL).setParameter(0、 "陈老师" )の.list(); 用{(リストTeacherEntity T) のSystem.out.println(t.getTeacherName() + "/" + t.getTeacherClass())。 } } @Test 公共 ボイドhql33(){ 文字列HQL "teacherName = TeacherEntityから:名" = 。 一覧 <TeacherEntity>リスト= session.createQuery(HQL).setParameter(」)。リスト(); 用{(リストTeacherEntity T) のSystem.out.println(t.getTeacherName() + "/" + t.getTeacherClass())。 } }
HQLの使用プレースホルダ:
(1)インデックス0からプレースホルダ尺度。
(2)上記名前付きパラメータを使用します。
例3:
@Test 公共 ボイドhql4(){ 文字列HQL = "teacherClass = TeacherEntityからteacherName、teacherClassを選択?" ; リスト <オブジェクト[]>リスト= session.createQuery(HQL).setParameter(0、 "Java1" ).LIST(); 用(オブジェクト[] OBJS:リスト){ System.out.printlnは(OBJS [ 0] .toString()+ "/" + OBJS [1 ] .toString()); } } @Test 公共 ボイドhql5(){ 文字列HQL = "teacherClass = TeacherEntityから新しいcom.project.hibernate.dto.TeacherDto(teacherName、teacherClass)を選択?" ;<TeacherDto>リスト= session.createQuery(HQL).setParameter(0、 "Java1" ).LIST(); 用{(リストTeacherDto DTO) のSystem.out.println(dto.getUserName() + "/" + dto.getUserClass())。 } } @Test 公共 ボイドhql6(){ 文字列HQL = "teacherClass = TeacherEntityから新しいマップ(teacherName、teacherClass)を選択?" ; 一覧 <地図>リスト= session.createQuery(HQL).setParameter(0、 "Java1" )の.list(); 用(地図マップ:リスト){ System.out.printlnは(map.get( "0")+ "/" + map.get(」
我々は複数のオブジェクトプロパティを照会すると、あなたは結果を受け取るためにオブジェクトの配列を使用することができます。
また、メソッドを有するように構成オブジェクトが受信される一時的なデータ転送(DTO)を、使用することができる対応するDTOにおいて、
マップは、キーマップボタンについて得られた結果が「0」、「1」、「2」、「3」であり、受信し使用することができる.....、対応する属性の値。
実施例4(ファジークエリ):
// 模糊查询 @Test 公共 無効hql8(){ 文字列HQL = "teacherClassようTeacherEntityから新しいマップ(teacherName、teacherClass)を選択します?" ; 一覧 <地図>リスト= session.createQuery(HQL).setParameter(0、 "%のJ%" )の.list(); 用(マップマップ:リスト){ System.out.printlnは(map.get( "0")+ "/" + map.get( "1" )); } }
実施例5(クエリに関連付けられています)。
// 关联查询 @Test 公共 無効hql9(){ 文字列HQL = "StudentEntityの左からの新しいマップを選択する(s.studentName、t.teacherName、t.teacherClass)t.teacherName = s.teacherトンに参加?"を。 一覧 <地図>リスト= session.createQuery(HQL).setParameter(0、 "陈老师" )の.list(); 用(マップマップ:リスト){ System.out.printlnは(map.get( "0")+ "/" + map.get( "1")+ "/" + map.get( "2" )); } }
エンティティ・クラスがすでに外部キーテーブルの生徒と教師のテーブルの主キーをマッピングしているので、ので、ここでは「s.f_t_id = t.t_idの」SQLの書き込みのようになります。
実施例6(ページングクエリ):
// ページングクエリ @Test 公共 ボイドhql10(){ // 現在のページ番号 INT currPage = 4 ; // ページショーの数 INTのpageSize = 5 ; 文字列HQL "?WHERE teacherName TeacherEntityから様" = ; リスト <TeacherEntity>リスト= session.createQuery(HQL).setParameter(0 、 "% 劉%" ) setFirstResultメソッド((currPage。 - 1)* のpageSize).setMaxResults(pageSizeを).LIST(); のために(T TeacherEntity:リスト){ システム。 out.printlnを(t.getTeacherName()); } }
Queryオブジェクトは、ページングの簡単な方法を提供します。
setFirstResultメソッド(INT firstResult)メソッドは、(限界(B)に相当)開始インデックスを設定します。
setMaxResults(int型maxResults)メソッドの戻り(限界(B)に相当B)レコードの最大数の設定。
実施例7(結果オブジェクトを返します)。
// 返回一个对象 @Test 公共 無効hql11(){ 文字列HQL "teacherName =?TeacherEntityから" = ; TeacherEntity T =(TeacherEntity)session.createQuery(HQL).setParameter(0、 "陈老师" ).uniqueResult(); System.out.println(t.getTeacherName() + "/" + t.getTeacherClass())。 }
一つだけ、またはnull uniqueResult()メソッドと返すように時を決定する例です。
実施例7(オブジェクトを削除し、修正):
// 删除对象 @Test 公共 無効hql12(){ 文字列HQL = "TeacherEntityから削除teacherName =?" ; INT iがsession.createQuery(HQL).setParameter(0、 "刘老师19" = ).executeUpdate(); System.out.println(I); } // 修改对象 @Test 公共 ボイドhql13(){ 文字列HQL = "更新TeacherEntityセットteacherName = teacherId =" ; INT iは= session.createQuery(HQL).setParameter(0、 "测试修改").setParameter(1、 "40288ae670f5d8a30170f5d8a5e90011" ).executeUpdateを()。 System.out.println(I); }
SQLを使用して休止状態
@Test 公共 のボイドSQL(){ 文字列のSQL = "SELECT * FROM sys_teacher" ; NativeQueryクエリ = session.createNativeQuery(SQL); //は、エンティティにデータをチェックアウトし、実体のニーズを管理するために休止状態 query.addEntity( 。TeacherEntityのクラス); リスト <TeacherEntity>一覧= Query.list(); のために(T TeacherEntity:リスト){ System.out.printlnは(t.getTeacherName()); } } @Test 公共 ボイドSQL2(){ 文字列のSQL = "選択t_name、sys_teacherからT_CLASS "; リスト <オブジェクト[]>リスト= session.createNativeQuery(SQL).LIST(); 用(オブジェクト[] OBJS:リスト){ System.out.printlnは(OBJS [ 0] .toString()+ "/" + OBJS [1 ] .toString()); } }