この記事の主な研究は、次のように、Hibernate HQLクエリの関連コンテンツです。
Hibernate Query Language(HQL)は、非常に強力なクエリ関数を備えた完全にオブジェクト指向のクエリステートメントです。それは多型、関連性、その他の特性を持っています。 HQLクエリは、Hibernateが正式に推奨するクエリメソッドでもあります。
次に、ケーススタディを通じて関連するクエリメソッドを分析します
classes.java:
パブリッククラスクラス{/*クラスID*/プライベートIDStudent.java:
パブリッククラスの学生{/*学生ID*/private int id;/*学生名*/プライベート文字列名;/*学生とクラス間の関係*/プライベートクラスクラス; //セッターとゲッターメソッドを省略}classes.hbm.xml:
<?xml version = "1.0"?> <!doctype hibernate-mapping public " - // hibernate/hibernateマッピングDTD 3.0 // en" "http://hibernate.sourceforge.net/hibernate-mapting-3.0.dtd" <class name = "classes" table = "t_classes" lazy = "false"> <id name = "id"> <generator/generator/> </id> <property name = "name"/> <! - 1対manyマッピング、inverse = "true"は、ピアへの関係を渡すことを意味します - > <enverse = "invers ="> < </class> </hibernate-mapping>
Student.hbm.xml:
<?xml version = "1.0"?> <!doctype hibernate-mapping public " - // hibernate/hibernateマッピングDTD 3.0 // en" "http://hibernate.sourceforge.net/hibernate-mapting-3.0.dtd"テーブル= "t_student"> <id name = "id"> <generator // id> <! - map normal properties-> <property name = "name"/> <! - 多額のマッピング、複数のエンドに外部キーを追加します。
/*結果セット属性リスト、エンティティクラスの属性タイプ、属性タイプは同じです*/ list <string> session.createquery( "select name from sudents")。list(); /*travel*/ for(iterator <string> iter = desustom.iterator(); iter.hasnext();){string name =(string)iter.next(); System.out.println(name); }注:単一の属性を照会する場合、返されたセットはコレクションであり、コレクション要素のタイプは属性のタイプです。
/*複数のプロパティをクエリして、オブジェクト配列を返します*/ list <object []> sention.createquery( "select id、name from sudent")。リスト(); /*transip*/ for(iterator <object []> iter = sustent.iterator(); iter.hasnext();){object [] obj =(object [])iter.next(); System.out.println(obj [0] + "、" + obj [1]); }注:複数の属性のクエリは、型オブジェクトアレイのコレクションを返します。これは理解しやすいです。単一の属性をクエリする場合、返されたコレクション要素タイプは属性のタイプですが、複数のタイプはどうですか?これは、処理するオブジェクト配列、つまりオブジェクト[]でなければなりません。
/*エンティティオブジェクトの対応するコンストラクターを設定し、オブジェクトをクエリすることでエンティティオブジェクトタイプのコレクションを返すことができます*/ list instound = session.createquery( "select new Student(id、name)from Student")。リスト(); /*travel*/ for(iterator iter = sustent.iterator(); iter.hasnext();){desute desute =(desute)iter.next(); system.out.println(sustent.getId() + "、" + sustent.getName()); }注:2番目のメソッドに加えて、オブジェクトアレイを返すことに加えて、対応するコンストラクターをエンティティオブジェクトに設定し、オブジェクトをクエリしてオブジェクトをクエリしてから、エンティティタイプのコレクションを返すこともできます。
/*エイリアスを使用できます*/ list <object []> sension.createquery( "select s.id、s.name from Student s")。list(); /*transip*/ for(iterator <object []> iter = sustent.iterator(); iter.hasnext();){object [] obj =(object [])iter.next(); System.out.println(obj [0] + "、" + obj [1]); } /*returnは、エンティティオブジェクトタイプのコレクションです*/ list <sudtent> session.session.createquery( "from Student")。list(); /*transip*/ for(iterator <sudute> iter = sustent.iterator(); iter.hasnext();){desute sustent =(desute)iter.next(); system.out.println(sustent.getName()); }注:クエリエンティティは、Fromクラス名の形式を直接使用できます。
/*selectを使用してエイリアスを使用します*/ list <sudtent> session.session.createquery( "Select S from Student s")。list(); /*transip*/ for(iterator <sudute> iter = sustent.iterator(); iter.hasnext();){desute sustent =(desute)iter.next(); system.out.println(sustent.getName()); }注:選択したキーワードを使用する場合は、エイリアスを使用する必要があります。別のポイントに注意する必要があります:HQLはselect *の形式をサポートしていません。
/ ** *エンティティオブジェクトをクエリするためにリストを使用する場合、エンティティオブジェクトデータを取得するためにクエリステートメントが発行されます * * hibernate:sudent0_.idをid0_として選択します。学生 ")。リスト(); /*travel*/ for(iterator <susted> iter = sustent.iterator(); iter.hasnext();){desutent sustent =(desute)iter.next(); system.out.println(sustent.getName()); }注:.list()メソッドを使用してオブジェクトを照会する場合、1つのステートメントのみが発行されます。つまり、物理オブジェクトデータを取得するステートメントです。
/*** n+1の問題が発生します。いわゆるN+1は、N+1 SQLステートメントの発行を指します * * * 1:IDリストを照会するステートメント * hibernate:select student0_0_0_をt_student student0_ * * * n:IDに基づいてn SQLステートメントを発行して、関連するオブジェクトをロードする * hid0_.id0_.id0_.id0_.id0_ name0_0_、 * desudent0_.createtime as createTime0_0_、sudent0_.classesid as classisid0_0_ * t_student dustent0_ where sustent0_.id =? * */ iterator <Student> iter = session.createquery( "from Student")。iterate(); /*travel*/ while(iter.hasnext()){desute sustent =(student)iter.next(); system.out.println(sustent.getName()); }注:iterator()を介してオブジェクトクエリを実行すると、n+1のステートメントが発行されます。最初に、エンティティオブジェクトのIDを照会するためにステートメントが発行され、次にnステートメントがNオブジェクトを照会するためのそれぞれのIDに基づいて発行されます。正式なパフォーマンスは比較的貧弱です。
/*最初のレベルのキャッシュにクエリコレクションを保存します。つまり、セッションレベルのキャッシュ*/ list <Student> session.Createquery( "From Student")。list(); /*transip*/ for(iterator <sudute> iter = sustent.iterator(); iter.hasnext();){desute sustent =(desute)iter.next(); system.out.println(sustent.getName()); } System.out.println("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Avoid N+1 problem* * Because after performingリストの操作、データはセッションキャッシュ(第1レベルのキャッシュ)に配置されます。最初に、IDリストをクエリするステートメントが発行され、対応するデータがIDに照合されている場合、IDに直面している場合、データが発行される場合、データが発行される場合、IDに照合します。キャッシュ、それ以外の場合は、n+1の問題が発生します*/ iterator <student = session.createquery()。注:実際、Hibernateはパフォーマンスを改善するためにIterator()クエリを提供しているのに、なぜそれがあまりにも役立つのですか?その理由は、Iterator()が最初のレベルのキャッシュからデータを取得するためです。キャッシュにデータがある場合、その効率は間違いなく非常に強力になります。ただし、初めて照会すると、キャッシュにデータが表示されるにはどうすればよいですか?これにより、いわゆるN+1の問題が発生します。上記のコードは、n+1の問題を回避できます。そのアイデアは、最初にlist()を使用してクエリを使用することです。list()がクエリ()がクエリになっているため、データは第1レベルのキャッシュ要約に存在し、iterator()を使用すると効率が非常に高くなります。
/*条件に応じたクエリ(通常、エイリアスはここで使用されますが、より便利です) /*travel*/ for(iterator <object []> iter = sustent.iterator(); iter.hasnext();){object [] obj =(object [])iter.next(); System.out.println(obj [0] + "、" + obj [1]); }注:条件付きクエリは、ネイティブSQLと同じであり、どちらもキーワードです。さらに、エイリアスを使用する方が通常、より便利です。上記のプログラムは複数の属性を照会するため、オブジェクト配列タイプのコレクションを返すため、オブジェクト配列内の要素は対応する属性です。
/*chenged programming*/ list <object []> desustor = session.createquery( "select s.id、s.name from Student Swhere s.name where?").setParameter(0、 "%0%").list(); /*travel*/ for(iterator <object []> iter = sustent.iterator(); iter.hasnext();){object [] obj =(object [])iter.next(); System.out.println(obj [0] + "、" + obj [1]); }注:パラメーターはプレースホルダーに渡すことができ、SQL注入を防ぐことができます。
/*chipプログラミング*/ list <object []> desustor = session.createquery( "select s.id、s.name from Student s s.name like:myname").setParameter( "myname"、 "%0%").list(); /*object array*/ for(iterator <object []> iter = sustent.iterator(); iter.hasnext();){object [] obj =(object [])iter.next(); System.out.println(obj [0] + "、" + obj [1]); }注:同様:myNameコロンの後にスペースはありません。そうしないと、エラーが発生します。
[Java] Plainコピーを表示/ * INメソッドを採用すると、1つの正式なパラメーターのみを使用できます */ list <object []> session.createquery( "Select S.Id、s.name from Student s.name where s.id in(:ids)").setParameterList( "ids"、newオブジェクト[] {1、2、3、4、5、5}); /*transip*/ for(iterator <object []> iter = sustent.iterator(); iter.hasnext();){object [] obj =(object [])iter.next(); System.out.println(obj [0] + "、" + obj [1]); }注:後にブラケットには1つの正式なパラメーターのみがあります。パラメーター値を設定すると、値をオブジェクト配列に渡すことができます。
/*生徒のクエリ2009-08では、mysqlの日付フォーマット関数を呼び出すことができます*/ list <object []> session.createquery( "select s.id、s.name from Student s where date_format( '%y-%m')=?").setParameter(0、 "2009-08")。 /*travel*/ for(iterator <object []> iter = sustent.iterator(); iter.hasnext();){object [] obj =(object [])iter.next(); System.out.println(obj [0] + "、" + obj [1]); } SimpleDateFormat sdf = new SimpledateFormat( "yyyy-mm-dd hh:mm:ss"); /*2009-08-01から2009-08-20までの学生は、MySQLの日付フォーマット関数を呼び出すことができます*/ list <object []> session.createquery( "Select S.Id、s.name from Student s s.createtime bety?and?").setparameter(0、sdf.parse( "2009-08-01 00:00:00:00:00:00:00:00")。 sdf.parse( "2009-08-20 23:59:59")).list(); /*transip*/ for(iterator <object []> iter = sustent.iterator(); iter.hasnext();){object [] obj =(object [])iter.next(); System.out.println(obj [0] + "、" + obj [1]); } / * select *を使用する *元のSQLステートメントを使用する必要があります。これは、HQLが複数のプロパティのクエリに似ているため、オブジェクト配列タイプのコレクションを返します */ list <object []> session.createsqlquery( "select * from t_student")。リスト(); /*transip*/ for(iterator <object []> iter = sustent.iterator(); iter.hasnext();){object [] obj =(object [])iter.next(); System.out.println(obj [0] + "、" + obj [1]); }注:HQLはselect *のクエリフォームをサポートしていませんが、冬眠は元のSQLステートメントをサポートしています。 SQLステートメントを使用してクエリできます。さらに、HQLの複数の属性に似ているため、オブジェクト配列タイプのコレクションを返します。
/*ページクエリ、SetFirstreSult(1)は、最初のデータから始まることを意味します。 setMaxResult(2)は、ページごとに2つのデータが表示されることを意味します*/ list Students = session.createquery( "from Student").setFirstreSult(1).SetMaxResults(2).List(); /*travel*/ for(iterator iter = sustent.iterator(); iter.hasnext();){desute desute =(desute)iter.next(); system.out.println(sustent.getName()); }/*ナビゲーションクエリ、s.classes.Nameクラスの学生からクラスへのナビゲート(これは、より多くの端からより少ない端までナビゲートします。これも可能です) /*travel*/ for(iterator <susted> iter = sustent.iterator(); iter.hasnext();){desutent sustent =(desute)iter.next(); system.out.println(sustent.getName()); }注:上記のクエリステートメントのs.classes.nameは、学生ナビゲーションからクラスクラスまでクラスの名前を取得することです。また、特定の属性を取得する際にクラスから学生へとナビゲートすることもできます。さらに、プログラムのクエリステートメントは、クラス名に2つの生徒全員を照会することを意味します。
/ *内部接続、Joinキーワードを使用するだけです */ list <object []> session.createquery( "select c.name、s.name from Student s s.classes c").list(); /*transaction*/ for(iterator <object []> iter = sustent.iterator(); iter.hasnext();){object [] obj =(object [])iter.next(); System.out.println(obj [0] + "、" + obj [1]); }注:内部接続のキーワードは結合され、接続はエイリアスとナビゲーションを使用してまだ実行されます。上記のクエリステートメントは、次のことを意味します。学生テーブルとクラステーブルからクラス名と学生名をクエリします(内側の接続は、クラスなし、学生や生徒がクラスなしでクエリすることができないなど、クエリに価値のある属性がある必要があることを意味します)。
/*left Joinはキーワード左Joing*/ list <object []> session.createquery( "select c.name、s.name from Student s Left Join s.classes c").list(); /*transip*/ for(iterator <object []> iter = sustent.iterator(); iter.hasnext();){object [] obj =(object [])iter.next(); System.out.println(obj [0] + "、" + obj [1]); }注:左結合に使用されるキーワードは、左結合されます。上記のクエリステートメントは、学生とクラスのテーブルから、クラス名と学生名をクエリします。左接続されているため、クラスのない生徒もクエリが施されます。
[Java]プレーンコピーの表示/*transip*/ for(iterator <object []> iter = sustent.iterator(); iter.hasnext();){object [] obj =(object [])iter.next(); System.out.println(obj [0] + "、" + obj [1]); }注:右結合を使用したキーワードは右結合です。上記のクエリステートメントは、学生とクラスのテーブルから、クラス名と学生名をクエリします。それは右に接続されているため、学生のないクラスが質問されます。
long count =(long)session.createquery( "Select count(*)from Student")。uniqueresult();
注:HQLでは *で使用できます。 Uniqueresult()とは、結果セットが1つだけで、返されたタイプが長いことを意味します。
/*queryステートメント*/ string hql = "c.name、count(s)from cless c c.name by c.name by c.name by c. name sgroup"; List <object []> desustor = session.createquery(hql).list(); /*travel*/ for(int i = 0; i <sustent.size(); i ++){object [] obj =(object [])sustent.get(i); System.out.println(obj [0] + "、" + obj [1]); }注:HQLはグループ化、ソートなどもサポートしています。上記のステートメントは、各クラスの名前を照会し、各クラスの生徒数、クラス名でグループ、クラス名で並べ替えることを意味します。
上記は、この記事のHibernate HQLクエリコードの例に関するすべてです。私はそれがすべての人に役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!