Hibernate Query Language(HQL)は、SQLと同様のオブジェクト指向クエリ言語ですが、テーブルと列の操作はありません。 HQLは、永続的なオブジェクトとそのプロパティに適しています。 HQLクエリは、冬眠から従来のSQLクエリに変換され、円のデータベースで操作を実行します。
ネイティブSQLをSQLステートメントと冬眠で直接使用することは可能ですが、HQLを使用して、データベースの移植性の手間を可能な限り回避し、HibernateのSQL生成とキャッシュ戦略の利点を採用することをお勧めします。
select、from、where of case-sensitiveなどのキーワードは、テーブル名や列名などのプロパティがHQLに敏感で区別されます。
声明から
完全な永続的なオブジェクトをメモリにロードする場合は、From句を使用します。 from句を使用した単純な構文は次のとおりです。
string hql = "from Employee"; query query = session.createquery(hql); list results = query.list();HQLのクラス名を完全に認定する必要がある場合は、次のパッケージとクラス名を指定するだけです。
string hql = "from com.hibernatebook.criteria.employee"; query query = session.createquery(hql); list results = query.list();
声明として
AS句は、特に非常に長いクエリがある場合、クラスのHQLクエリに割り当てるエイリアスに使用できます。たとえば、上記の簡単な例は次のとおりです。
string hql = "from employee as e"; query query = session.createquery(hql); list results = query.list();
ASキーワードはオプションであり、以下に示すように、次のクラス名でエイリアスを直接指定することもできます。
string hql = "from Employee e"; query query = session.createquery(hql); list results = query.list();
句を選択します
Select句は、From句の結果セットよりも多くの制御を提供します。オブジェクト全体の代わりにオブジェクトのいくつかのプロパティを取得する場合は、Select句を使用します。選択したステートメントを使用して従業員オブジェクトを取得する単純な構文は次のとおりです。
string hql = "ememonly e" from Employee e "; query query = session.createquery(hql); list results = query.list();
ここでは、従業員。FirstNameは従業員のオブジェクトの属性であり、従業員のテーブルのフィールドではないことに注意してください。
ここで条項
ストレージから返される特定のオブジェクトを絞り込む場合は、Where句を使用できます。ここに、where句を使用した単純な構文は次のとおりです。
string hql = "from Employee e where where e.id = 10"; query query = session.createquery(hql); list results = query.list();
句ごとに注文します
HQLクエリの結果を並べ替えるには、条項ごとに使用する必要があります。結果を、結果をオブジェクトの属性に並べ替えることにより、結果を設定して上昇(ASC)または下降(DESC)で並べ替えることができます。次に、句ごとの順序を使用した単純な構文です。
string hql = "from Employee e where E.id> 10 Order by E.Salary desc"; query query = session.createquery(hql); list results = query.list();
以下に示すように、複数のプロパティで並べ替えたい場合は、コンマで句で区切られたコマンドの最後に追加のプロパティを追加するだけです。
string hql = "from Employee e Were Where E.id> 10" + "e.firstname desc、e.salary desc"; query query = session.createquery(hql); list results = query.list();
グループごとのグループ
この句は、Hibernateの属性ベースの値のデータベースとグループからの情報の抽出を許可し、通常、結果を使用して合計値を含めます。句ごとにグループを使用した単純な構文は次のとおりです。
string hql = "select sum(e.salary)、e.firtname from Employee e" + "by e.firstname"; query query = session.createquery(hql); list results = query.list();
名前付きパラメーターを使用します
Hibernateは、HQLクエリパラメーターでサポートされています。これにより、SQLインジェクション攻撃のHQLクエリを防御することなく、ユーザーからの入力を簡単に書き込み、受け入れることができます。名前のパラメーターを使用した単純な構文は次のとおりです。
string hql = "from Employee e where E.id =:employee_id"; query query = session.createquery(hql); query.setparameter( "employee_id"、10); list results = query.list();
句を更新します
バッチの更新は、hibernate3を備えた新しいHQLと、hibernate 3およびhibernate2と同じ異なる削除作業です。クエリインターフェイスには、HQLアップデートまたは削除ステートメントを実行するためのexecuteUpdate()というメソッドが含まれるようになりました。
更新句は、1つ以上のオブジェクトで1つ以上のプロパティを更新するために使用できます。更新句を使用した単純な構文は次のとおりです。
string hql = "sated emblated employe set salary =:salary" + "where id =:employee_id"; query query = session.createquery(hql); query.setparameter( "salary"、1000); query.setparameter( "employee_id"、10); int result = query.exeupdate(
句を削除します
削除句は、1つ以上のオブジェクトを削除するために使用できます。削除句を使用した単純な構文は次のとおりです。
string hql = "delete from Employee" + "where id =:employee_id"; query query = session.createquery(hql); query.setparameter( "employee_id"、10); int result = query.executeupdate(); system.out.println( "rows fach:"
句を挿入します
HQLは、あるオブジェクトから別のオブジェクトにレコードのみを挿入できる条項への挿入をサポートします。句に挿入する単純な構文は次のとおりです。
string hql = "inserting into inemolly(firstname、lastname、salary)" + "select firstname、lastname、salary from old_employee"; query query = session.createquery(hql); int result = query.executeupdate(); system.out.println( "rows reash:" + result);
集約方法
HQLは、SQLと同様の複数の集約方法をサポートしています。 SQLと次のリストで同じようにHQLで動作します。
個別のキーワードは、この行に設定された一意の値のみを計算します。次のクエリは、一意のカウントのみを返します。
string hql = "employee e"; query query = session.createquery(hql); list results = query.list();
クエリページネーションを使用します
ページネーションクエリインターフェイスには2つの方法があります。
一緒に、ウェブサイトまたはスイングアプリケーションでページングコンポーネントを構築できます。例を示します。10行を取得するために拡張できます。
string hql = "from Employee"; query query = session.createquery(hql); query.setfirstrosult(1); query.setmaxResults(10); list results = query.list();
クエリ基準
Hibernateは、RDBMSテーブルで使用可能なオブジェクトと順次データを操作する代替方法を提供します。メソッドの1つは標準APIです。これにより、フィルタリングルールと論理条件を適用できる標準クエリオブジェクトプログラミングを確立できます。
Hibernateのセッションインターフェイスは、返された永続オブジェクトを作成するために使用できるクラスのインスタンスを提供し、アプリケーションはCreateCriteria()メソッドに条件付きクエリを実行します。
以下は、従業員クラスに対応する各オブジェクトを単純に返すだけで、最も単純な条件付きクエリの例です。
基準cr = session.createcriteria(employee.class); list results = cr.list();
制限と基準:
add()メソッドを使用して、Criteriaオブジェクトを使用して制限クエリを追加できます。以下は、2000年に等しい給与返品記録で制限を追加する例です。
基準cr = session.createcriteria(employee.class); cr.add(restrictions.eq( "salary"、2000)); list results = cr.list();
さまざまなシナリオをカバーするいくつかの例を以下に示し、必要に応じて使用できます。
基準cr = session.createcriteria(employee.class); // 2000cr.add(restrictions.gt( "salary"、2000)))を超える給与を持つ記録を取得するには、2000cr.add(restrictions.lt( "salary"、2000)、restrictions.lt( "salary")); // zaracr.add(restions.like( "firstName"、 "zara%")); //上記の制限の敏感な形式。 nullcr.add(restrictions.isnull( "salary"))); //指定されたプロパティがnullcr.add(restions.isnotnull( "salary"))でないかどうかを確認するには、指定されたプロパティがemptyccr.addであるかどうかを確認する(制限.isempty( "salary")); emptycr.add(restions.isnotempty( "給与"));論理的発現を使用して、次の条件を制限するために作成またはORSを作成できます。基準給与=制限.gt( "Salary"、2000); Criterion name = restions.ilike( "firstnname"、 "zara%"); // // conditionsologicalExpression orexp = restrictions。 cr.list();
ただし、上記のすべての条件は、以前のチュートリアルでHQLを使用して直接導入できます。
ページングの使用基準:
標準的なインターフェイス、ページネーションの2つの方法もあります。
上記の2つの方法とともに、ウェブサイトまたはスイングアプリケーションにページングコンポーネントを構築できます。これが例です。一度に10行を取得するために拡張できます。
基準cr = session.createcriteria(employee.class); cr.setfirstrosult(1); cr.setmaxResults(10); list results = cr.list();
結果を並べ替える:
標準のAPIは、オブジェクトのプロパティに従って、org.hibernate.criterion.order cr sorting setting setting and incending Orderに並べ替えることを提供します。この例は、注文クラスの結果セットを使用して並べ替える方法を示しています。
基準cr = session.createcriteria(employee.class); // 2000cr.add(restrictions.gt( "salary"、2000)); // surting oder.desc( "salary")); // sulting sulting inddorderのsurtcrit.asscrit.asscrit.( "sal"( "salary")); cr.list();
予測と集約:
基準APIは、平均、最大、または最小属性値を取得するために使用できるorg.hibernate.criterion.projectionsクラスを提供します。プロジェクションクラスは、プロジェクションインスタンスを取得するためのいくつかの静的な工場の方法を提供するため、クラスの制限に似ています。を提供します
規定どおりに使用できるさまざまなスキームを含むいくつかの例を次に示します。
Criteria cr = session.createcriteria(employee.class); // total row count.cr.setproject(projections.rowcount()); // property.cr.setproject(projections.avg( "salary")); // property.cr.cr.cr.setproject(firstsproject( "first)ssetproject(" first)ssetproject( "first)get(" first( "first)get); Property.cr.setProjection(projections.max( "Salary")); // property.cr.setProjection(projections.min( "Salary")); // property.cr.setProjection(projections.sum( "salary")); //
基準クエリの例:
次のPojoクラスを検討してください。
パブリッククラスの従業員{private int id;プライベート文字列firstName;プライベート文字列lastName;プライベート給与; public Employee(){} public Employee(string fname、string lname、int salary){this.firstname = fname; this.lastname = lname; this.salary = salary; } public int getId(){return id; } public void setid(int id){this.id = id; } public string getFirstName(){return firstName; } public void setFirstName(string first_name){this.firstname = first_name; } public string getLastName(){return lastName; } public void setLastName(string last_name){this.lastname = last_name; } public int getSalary(){return Salary; } public void setSalary(int salary){this.salary = salary; }}次の従業員テーブルを作成して、従業員オブジェクトを保存しましょう。
Table Employeeの作成(ID int not null auto_increment、first_name varchar(20)デフォルトnull、last_name varchar(20)デフォルトnull、salary int default null、primary key(id));
以下はマッピングされたファイルになります。
<?xml version = "1.0" encoding = "utf-8"?> <!doctype hibernate-mapping public " - // hibernate/hibernateマッピングdtd // en" "http://www.hibernate.org/dtd/dtd/hibernate-mapping-33.0.dtd"> "luppelace-mapping ="> <class-maps <メタ属性= "class-description">このクラスには、従業員の詳細が含まれています。 </meta> <id name = "id" type = "int" column = "id"> <generator/> </id> <property name = "firstName" column = "first_name" type = "string"/> <プロパティ名= "lastName" colummen = "last_name" type = "string"/> <プロパティ名= "salary" columer "int" int "int"/fiver>> <
最後に、実行するアプリケーションクラスのメイン()メソッドを作成し、アプリケーションの基準クエリを使用します。
java.util.listをインポートします。 Import Java.util.date; import java.util.iterator; org.hibernate.hibernateExceptionをインポートします。 org.hibernate.sessionをインポートします。 org.hibernate.transaction; Import org.hibernate.sessionfactory; Import org.hibernate.criteria; import org.hibernate.criterion.Restrictions; Import org.hibernate.criterion.projection; projection.projection; Import org.hibernate.cfg.configuration; public static void main(string [] args){try {factory = new configuration()。configure()。buildSessionFactory(); } catch(throwable ex){system.err.println( "SessionFactoryオブジェクトの作成に失敗しました。" + ex);新しい例外initializererror(ex); } managemployee me = new Managemployee(); / *データベースに少数の従業員レコードを追加 */ integer empid1 = me.addemployee( "zara"、 "ali"、2000); integer empid2 = me.addemployee( "daisy"、 "das"、5000); Integer Empid3 = me.addemployee( "John"、 "Paul"、5000); integer empid4 = me.addemployee( "mohd"、 "yasee"、3000); / *すべての従業員をリストダウン */ me.listemployee(); / *従業員の合計を印刷 */ me.countemployee(); / * toatl Salaryを印刷 */ me.TotalSalary(); } / *データベースで従業員を作成する方法 * / public Integer addemployee(string fname、string lname、int salary){session session = factory.opensession();トランザクションTx = null; Integer EmployeeID = null; try {tx = session.begintransaction();従業員=新しい従業員(fName、lname、給与); EmployeeId =(integer)session.save(Employee); tx.commit(); } catch(hibernateException e){if(tx!= null)tx.rollback(); e.printstacktrace(); }最後に{session.close(); } employeedを返します。 } / * 2000を超える給与を持っているすべての従業員を読む方法トランザクションTx = null; try {tx = session.begintransaction();基準cr = session.createcriteria(employee.class); //制限を追加します。 cr.add(restrictions.gt( "Salary"、2000));従業員= cr.list(); for(iterator iterator = employes.iterator(); iterator.hasnext();){従業員=(従業員)iterator.next(); System.out.print( "名:" + employee.getFirstName()); System.out.print( "last Name:" + Employee.getLastName()); System.out.println( "salary:" + employee.getSalary()); } tx.commit(); } catch(hibernateException e){if(tx!= null)tx.rollback(); e.printstacktrace(); }最後に{session.close(); }} / *記録の総数を印刷するメソッドトランザクションTx = null; try {tx = session.begintransaction();基準cr = session.createcriteria(employee.class); //合計行数を取得します。 cr.setProjection(projections.RowCount());リストrowcount = cr.list(); System.out.println( "合計Coint:" + rowcount.get(0)); tx.commit(); } catch(hibernateException e){if(tx!= null)tx.rollback(); e.printstacktrace(); }最後に{session.close(); }} / *給与の合計を印刷する方法 * / public void totalSalary(){session session = factory.opensession();トランザクションTx = null; try {tx = session.begintransaction();基準cr = session.createcriteria(employee.class); //総給与を取得します。 cr.setProjection(projections.sum( "Salary"));リストtotalSalary = cr.list(); System.out.println( "合計給与:" + totalSalary.get(0)); tx.commit(); } catch(hibernateException e){if(tx!= null)tx.rollback(); e.printstacktrace(); }最後に{session.close(); }}}コンパイルと実行:
上記のアプリケーションをコンパイルして実行する手順は次のとおりです。コンパイルして実行する前に、パスとクラスパスを適切に設定していることを確認してください。
次の結果が得られ、記録は従業員のテーブルに作成されます。
$ Java Managemployee
.....さまざまなログメッセージがここに表示されます.........名:デイジー姓:DAS給与:5000ファースト名:ジョン姓:5000ファースト名:MOHD姓:Yasee Salary:3000total Coint:4total Salary:15000
従業員のテーブルを確認する場合は、次のように記録する必要があります。
mysql> select * from Employee;
+------------------------------------+| ID | first_name | last_name |給料 |+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------