検索
ホームページJava&#&チュートリアルJava の Hibernate フレームワークでデータベース データをクエリする

Hibernate Query Language (HQL) は SQL に似たオブジェクト指向のクエリ言語ですが、HQL はテーブルや列を操作するのではなく、永続オブジェクトとそのプロパティを操作します。 HQL クエリは Hibernate によって従来の SQL クエリに変換され、データベース上で操作を実行します。

SQL ステートメントを直接使用し、Hibernate でネイティブ SQL を使用することも可能ですが、データベースの移植性の問題を可能な限り回避し、Hibernate の SQL 生成およびキャッシュ戦略を活用するために HQL を使用することをお勧めします。

SELECT、FROM、WHERE などのキーワードでは大文字と小文字が区別されませんが、テーブル名や列名のような属性は HQL では大文字と小文字が区別されます。

FROM ステートメント

完全な永続オブジェクトをメモリにロードする場合は、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 ステートメント

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 句

SELECT 句from 句よりも結果セットをより詳細に制御できます。オブジェクト全体ではなく、オブジェクトの複数のプロパティを取得したい場合は、SELECT 句を使用します。以下は、SELECT ステートメントを使用して Employee オブジェクトの FIRST_NAME フィールドのみを取得する単純な構文です。

String hql = "SELECT E.firstName FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();

ここで、Employee.firstName は Employee オブジェクトのプロパティであり、フィールドではないことに注意してください。従業員テーブル。

WHERE 句

ストレージから返される特定のオブジェクトを絞り込みたい場合は、WHERE 句を使用できます。 WHERE 句を使用した簡単な構文を次に示します。

String hql = "FROM Employee E WHERE E.id = 10";
Query query = session.createQuery(hql);
List results = query.list();

ORDER BY 句

HQL クエリの結果を並べ替えるには、ORDER BY 句を使用する必要があります。結果セット内の結果を、オブジェクト内の任意のプロパティごとに昇順 (ASC) または降順 (DESC) で並べ替えることができます。以下は、ORDER BY 句を使用した簡単な構文です:

String hql = "FROM Employee E WHERE E.id > 10 ORDER BY E.salary DESC";
Query query = session.createQuery(hql);
List results = query.list();

複数の属性で並べ替える場合は、以下のコマンド終了に示すように、追加の属性をカンマで区切って句に追加するだけです。

GROUP BY 句

この句を使用すると、プロパティの値に基づいて Hibernate のデータベースおよびグループから情報を抽出できます。通常、結果には合計値が含まれます。 GROUP BY 句を使用した非常に単純な構文を次に示します。

String hql = "FROM Employee E WHERE E.id > 10 " +
       "ORDER BY E.firstName DESC, E.salary DESC ";
Query query = session.createQuery(hql);
List results = query.list();


名前付きパラメータの使用

Hibernate は、HQL クエリで名前付きパラメータをサポートしています。これにより、SQL インジェクション攻撃を防御することなく、ユーザーからの入力を受け入れる HQL クエリを簡単に作成できるようになります。名前付きパラメーターを使用した簡単な構文は次のとおりです。

String hql = "SELECT SUM(E.salary), E.firtName FROM Employee E " +
       "GROUP BY E.firstName";
Query query = session.createQuery(hql);
List results = query.list();


UPDATE 句

バッチ更新は Hibernate3 の HQL で新しく追加され、削除の動作は Hibernate 3 と Hibernate2 で異なります。 Query インターフェイスには、HQL UPDATE または DELETE ステートメントを実行するためのexecuteUpdate() という名前のメソッドが含まれるようになりました。

UPDATE 句を使用して、1 つ以上のオブジェクトの 1 つ以上のプロパティを更新できます。 UPDATE 句を使用した簡単な構文を次に示します。

String hql = "FROM Employee E WHERE E.id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id",10);
List results = query.list();

DELETE 句 DELETE 句は、1 つ以上のオブジェクトを削除するために使用できます。 DELETE 句を使用した簡単な構文は次のとおりです。

String hql = "UPDATE Employee set salary = :salary " +
       "WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("salary", 1000);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);


INSERT 句

HQL は、あるオブジェクトから別のオブジェクトにレコードを挿入できる場合にのみ INSERT INTO 句をサポートします。以下は、INSERT INTO 句を使用した簡単な構文です。

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 affected: " + result);


集計メソッド

HQL は、SQL と同様に、複数の集計メソッドをサポートしています。 HQL でも SQL と同じように機能し、利用可能な関数のリストを以下に示します。



DISTINCT キーワードは、その行に設定された一意の値のみをカウントします。次のクエリは一意のカウントのみを返します:

String hql = "INSERT INTO Employee(firstName, lastName, salary)" +
       "SELECT firstName, lastName, salary FROM old_employee";
Query query = session.createQuery(hql);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);

クエリを使用したページ分割

ページ分割されたクエリ インターフェイスには 2 つの方法があります。

Query setFirstResult(int startPosition)


Query setMaxResults(int maxResult)

上記 2 つのメソッドを一緒に使用すると、Web サイトまたは Swing アプリケーション上にページング コンポーネントを構築できます。 10 行をフェッチするように拡張できる例を次に示します。

String hql = "SELECT count(distinct E.firstName) FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();

クエリ条件

Hibernate は、RDBMS テーブルで使用可能なオブジェクトと順次データを操作する代替方法を提供します。 1 つの方法は標準 API です。これを使用すると、標準クエリ オブジェクトをプログラムで作成し、フィルタリング ルールと論理条件を適用できます。 Hibernate の Session インターフェイスは、アプリケーションが条件付きクエリを実行するときに永続オブジェクトを返すクラスのインスタンスを作成するために使用できる Criteria オブジェクトの createCriteria() メソッドを提供します。

以下は、Employee クラスに対応する各オブジェクトを単純に返す条件付きクエリの最も単純な例です。

String hql = "FROM Employee";
Query query = session.createQuery(hql);
query.setFirstResult(1);
query.setMaxResults(10);
List results = query.list();


制限と基準:

add() メソッドを使用して、制限クエリを Criteria オブジェクトに追加できます。以下は、レコードによって返される給与が 2000 に等しい制限を追加する例です:

Criteria cr = session.createCriteria(Employee.class);
List results = cr.list();

ここでは、さまざまなシナリオをカバーするいくつかの例を示し、要件に従って使用できます:

Criteria cr = session.createCriteria(Employee.class);
cr.add(Restrictions.eq("salary", 2000));
List results = cr.list();

上記の条件は、前のチュートリアルで紹介した HQL を使用して直接使用できます。

ページングの標準:

ページングには標準インターフェイスと 2 つの方法もあります。

公開基準 setFirstResult(int firstResult)

public Criteria setMaxResults(int maxResults)

采用上述两种方法一起,我们可以在我们的网站或Swing应用程序构建一个分页组件。下面是例子,可以扩展来每次获取10行:

Criteria cr = session.createCriteria(Employee.class);
cr.setFirstResult(1);
cr.setMaxResults(10);
List results = cr.list();

排序的结果:
标准的API提供了org.hibernate.criterion.Order类排序按升序或降序排列你的结果集,根据对象的属性。这个例子演示了如何使用Order类的结果集进行排序:

Criteria cr = session.createCriteria(Employee.class);
// To get records having salary more than 2000
cr.add(Restrictions.gt("salary", 2000));
 
// To sort records in descening order
crit.addOrder(Order.desc("salary"));
 
// To sort records in ascending order
crit.addOrder(Order.asc("salary"));
 
List results = cr.list();

预测与聚合:
该Criteria API提供了一个org.hibernate.criterion.Projections类可用于获取平均值,最大值或最小值的属性值。Projections类是类似于类限制,因为它提供了几个静态工厂方法用于获得Projection 实例。  provides the

以下是涉及不同的方案的一些例子,可按规定使用:

Criteria cr = session.createCriteria(Employee.class);
 
// To get total row count.
cr.setProjection(Projections.rowCount());
 
// To get average of a property.
cr.setProjection(Projections.avg("salary"));
 
// To get distinct count of a property.
cr.setProjection(Projections.countDistinct("firstName"));
 
// To get maximum of a property.
cr.setProjection(Projections.max("salary"));
 
// To get minimum of a property.
cr.setProjection(Projections.min("salary"));
 
// To get sum of a property.
cr.setProjection(Projections.sum("salary"));

Criteria Queries 例子:
考虑下面的POJO类:

public class Employee {
  private int id;
  private String firstName;
  private String lastName; 
  private int salary;
 
  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;
  }
}

让我们创建下面的EMPLOYEE表来存储Employee对象:

create table EMPLOYEE (
  id INT NOT NULL auto_increment,
  first_name VARCHAR(20) default NULL,
  last_name VARCHAR(20) default NULL,
  salary   INT default NULL,
  PRIMARY KEY (id)
);

以下将被映射文件。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
 "-//Hibernate/Hibernate Mapping DTD//EN"
 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 
<hibernate-mapping>
  <class name="Employee" table="EMPLOYEE">
   <meta attribute="class-description">
     This class contains the employee detail.
   </meta>
   <id name="id" type="int" column="id">
     <generator class="native"/>
   </id>
   <property name="firstName" column="first_name" type="string"/>
   <property name="lastName" column="last_name" type="string"/>
   <property name="salary" column="salary" type="int"/>
  </class>
</hibernate-mapping>

最后,我们将创建应用程序类的main()方法来运行,我们将使用Criteria查询的应用程序:

import java.util.List;
import java.util.Date;
import java.util.Iterator;
  
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import org.hibernate.criterion.Projections;
import org.hibernate.cfg.Configuration;
 
public class ManageEmployee {
  private static SessionFactory factory;
  public static void main(String[] args) {
   try{
     factory = new Configuration().configure().buildSessionFactory();
   }catch (Throwable ex) {
     System.err.println("Failed to create sessionFactory object." + ex);
     throw new ExceptionInInitializerError(ex);
   }
   ManageEmployee ME = new ManageEmployee();
 
   /* Add few employee records in database */
   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);
 
   /* List down all the employees */
   ME.listEmployees();
 
   /* Print Total employee&#39;s count */
   ME.countEmployee();
 
   /* Print Toatl salary */
   ME.totalSalary();
  }
  /* Method to CREATE an employee in the database */
  public Integer addEmployee(String fname, String lname, int salary){
   Session session = factory.openSession();
   Transaction tx = null;
   Integer employeeID = null;
   try{
     tx = session.beginTransaction();
     Employee employee = new Employee(fname, lname, salary);
     employeeID = (Integer) session.save(employee);
     tx.commit();
   }catch (HibernateException e) {
     if (tx!=null) tx.rollback();
     e.printStackTrace();
   }finally {
     session.close();
   }
   return employeeID;
  }
 
  /* Method to READ all the employees having salary more than 2000 */
  public void listEmployees( ){
   Session session = factory.openSession();
   Transaction tx = null;
   try{
     tx = session.beginTransaction();
     Criteria cr = session.createCriteria(Employee.class);
     // Add restriction.
     cr.add(Restrictions.gt("salary", 2000));
     List employees = cr.list();
 
     for (Iterator iterator =
              employees.iterator(); iterator.hasNext();){
      Employee employee = (Employee) iterator.next();
      System.out.print("First Name: " + 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();
   }finally {
     session.close();
   }
  }
  /* Method to print total number of records */
  public void countEmployee(){
   Session session = factory.openSession();
   Transaction tx = null;
   try{
     tx = session.beginTransaction();
     Criteria cr = session.createCriteria(Employee.class);
 
     // To get total row count.
     cr.setProjection(Projections.rowCount());
     List rowCount = cr.list();
 
     System.out.println("Total Coint: " + rowCount.get(0) );
     tx.commit();
   }catch (HibernateException e) {
     if (tx!=null) tx.rollback();
     e.printStackTrace();
   }finally {
     session.close();
   }
  }
 /* Method to print sum of salaries */
  public void totalSalary(){
   Session session = factory.openSession();
   Transaction tx = null;
   try{
     tx = session.beginTransaction();
     Criteria cr = session.createCriteria(Employee.class);
 
     // To get total salary.
     cr.setProjection(Projections.sum("salary"));
     List totalSalary = cr.list();
 
     System.out.println("Total Salary: " + totalSalary.get(0) );
     tx.commit();
   }catch (HibernateException e) {
     if (tx!=null) tx.rollback();
     e.printStackTrace();
   }finally {
     session.close();
   }
  }
}

编译和执行:
下面是步骤来编译并运行上述应用程序。请确保您已在进行的编译和执行之前,适当地设置PATH和CLASSPATH。

创建hibernate.cfg.xml配置文件中配置章节解释。

创建Employee.hbm.xml映射文件,如上图所示。

创建Employee.java源文件,如上图所示,并编译它。

创建ManageEmployee.java源文件,如上图所示,并编译它。

执行ManageEmployee二进制运行程序.

会得到以下结果,并记录将创建在EMPLOYEE表中。

$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
 
First Name: Daisy Last Name: Das Salary: 5000
First Name: John Last Name: Paul Salary: 5000
First Name: Mohd Last Name: Yasee Salary: 3000
Total Coint: 4
Total Salary: 15000

如果检查EMPLOYEE表,它应该记录如下:

mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 14 | Zara    | Ali    |  2000 |
| 15 | Daisy   | Das    |  5000 |
| 16 | John    | Paul   |  5000 |
| 17 | Mohd    | Yasee   |  3000 |
+----+------------+-----------+--------+
4 rows in set (0.00 sec)

更多在Java的Hibernate框架中对数据库数据进行查询操作相关文章请关注PHP中文网!

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Javaがクロスプラットフォームデスクトップアプリケーションを開発するための人気のある選択肢なのはなぜですか?Javaがクロスプラットフォームデスクトップアプリケーションを開発するための人気のある選択肢なのはなぜですか?Apr 25, 2025 am 12:23 AM

javaispopularforsoss-platformdesktopapplicationsduetoits "writeonce、runaynay" philosophy.1)itusesbytecodatiTatrunnanyjvm-adipplatform.2)ライブラリリケンディンガンドジャヴァフククレアティック - ルルクリス

Javaでプラットフォーム固有のコードを作成する必要がある場合がある状況について話し合います。Javaでプラットフォーム固有のコードを作成する必要がある場合がある状況について話し合います。Apr 25, 2025 am 12:22 AM

Javaでプラットフォーム固有のコードを作成する理由には、特定のオペレーティングシステム機能へのアクセス、特定のハードウェアとの対話、パフォーマンスの最適化が含まれます。 1)JNAまたはJNIを使​​用して、Windowsレジストリにアクセスします。 2)JNIを介してLinux固有のハードウェアドライバーと対話します。 3)金属を使用して、JNIを介してMacOSのゲームパフォーマンスを最適化します。それにもかかわらず、プラットフォーム固有のコードを書くことは、コードの移植性に影響を与え、複雑さを高め、パフォーマンスのオーバーヘッドとセキュリティのリスクをもたらす可能性があります。

プラットフォームの独立性に関連するJava開発の将来の傾向は何ですか?プラットフォームの独立性に関連するJava開発の将来の傾向は何ですか?Apr 25, 2025 am 12:12 AM

Javaは、クラウドネイティブアプリケーション、マルチプラットフォームの展開、および言語間の相互運用性を通じて、プラットフォームの独立性をさらに強化します。 1)クラウドネイティブアプリケーションは、GraalvmとQuarkusを使用してスタートアップ速度を向上させます。 2)Javaは、埋め込みデバイス、モバイルデバイス、量子コンピューターに拡張されます。 3)Graalvmを通じて、JavaはPythonやJavaScriptなどの言語とシームレスに統合して、言語間の相互運用性を高めます。

Javaの強力なタイピングは、プラットフォームの独立性にどのように貢献しますか?Javaの強力なタイピングは、プラットフォームの独立性にどのように貢献しますか?Apr 25, 2025 am 12:11 AM

Javaの強力なタイプ化されたシステムは、タイプの安全性、統一タイプの変換、多型を通じてプラットフォームの独立性を保証します。 1)タイプの安全性は、コンパイル時間でタイプチェックを実行して、ランタイムエラーを回避します。 2)統一された型変換ルールは、すべてのプラットフォームで一貫しています。 3)多型とインターフェイスメカニズムにより、コードはさまざまなプラットフォームで一貫して動作します。

Javaネイティブインターフェイス(JNI)がプラットフォームの独立性をどのように妥協できるかを説明します。Javaネイティブインターフェイス(JNI)がプラットフォームの独立性をどのように妥協できるかを説明します。Apr 25, 2025 am 12:07 AM

JNIはJavaのプラットフォームの独立を破壊します。 1)JNIは特定のプラットフォームにローカルライブラリを必要とします。2)ローカルコードをターゲットプラットフォームにコンパイルおよびリンクする必要があります。3)異なるバージョンのオペレーティングシステムまたはJVMは、異なるローカルライブラリバージョンを必要とする場合があります。

Javaのプラットフォームの独立性を脅かしたり強化したりする新しいテクノロジーはありますか?Javaのプラットフォームの独立性を脅かしたり強化したりする新しいテクノロジーはありますか?Apr 24, 2025 am 12:11 AM

新しいテクノロジーは、両方の脅威をもたらし、Javaのプラットフォームの独立性を高めます。 1)Dockerなどのクラウドコンピューティングとコンテナ化テクノロジーは、Javaのプラットフォームの独立性を強化しますが、さまざまなクラウド環境に適応するために最適化する必要があります。 2)WebAssemblyは、Graalvmを介してJavaコードをコンパイルし、プラットフォームの独立性を拡張しますが、パフォーマンスのために他の言語と競合する必要があります。

JVMのさまざまな実装は何ですか、そしてそれらはすべて同じレベルのプラットフォームの独立性を提供しますか?JVMのさまざまな実装は何ですか、そしてそれらはすべて同じレベルのプラットフォームの独立性を提供しますか?Apr 24, 2025 am 12:10 AM

JVMの実装が異なると、プラットフォームの独立性が得られますが、パフォーマンスはわずかに異なります。 1。OracleHotspotとOpenJDKJVMは、プラットフォームの独立性で同様に機能しますが、OpenJDKは追加の構成が必要になる場合があります。 2。IBMJ9JVMは、特定のオペレーティングシステムで最適化を実行します。 3. Graalvmは複数の言語をサポートし、追加の構成が必要です。 4。AzulzingJVMには、特定のプラットフォーム調整が必要です。

プラットフォームの独立性は、開発コストと時間をどのように削減しますか?プラットフォームの独立性は、開発コストと時間をどのように削減しますか?Apr 24, 2025 am 12:08 AM

プラットフォームの独立性により、開発コストが削減され、複数のオペレーティングシステムで同じコードセットを実行することで開発時間を短縮します。具体的には、次のように表示されます。1。開発時間を短縮すると、1セットのコードのみが必要です。 2。メンテナンスコストを削減し、テストプロセスを統合します。 3.展開プロセスを簡素化するための迅速な反復とチームコラボレーション。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター