首頁 Java java教程 在Java的Hibernate框架中對資料庫資料進行查詢操作

在Java的Hibernate框架中對資料庫資料進行查詢操作

Jan 23, 2017 am 10:03 AM

Hibernate查詢語言(HQL)是一種物件導向的查詢語言,類似於SQL,但不是對錶和列操作,HQL適用於持久性物件和它們的屬性。 HQL查詢由Hibernate轉換成傳統的SQL查詢,這會在圈上的資料庫執行操作。

雖然可以直接使用SQL語句和Hibernate使用原生SQL,但建議使用HQL盡可能避免資料庫可移植性的麻煩,並採取Hibernate的SQL產生和快取策略的優勢。

都像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子句可以用

String hql = "FROM Employee AS E";
Query query = session.createQuery(hql);
List results = query.list();
登入後複製

AS 語句

AS子句可以用來別名分配給類別中的HQL查詢,特別是當有很長的查詢。例如,我們前面簡單的例子是以下幾點:

String hql = "FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
登入後複製

AS關鍵字是可選的,也可以直接在之後的類別名稱指定別名,如下所示:

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

SELECT 子句

SELECT子句提供了更多的控制權比from子句的結果集。如果想要取得物件而不是整個物件的幾個屬性,使用SELECT子句。下面是使用SELECT語句來取得Employee物件只是FIRST_NAME欄位的簡單的語法:

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


值得注意的是在這裡,Employee.firstName是Employee物件的屬性,而不是EMPLOYEE表的一個欄位。

WHERE 子句

如果想縮小了從儲存返回的特定對象,可以使用WHERE子句。以下是使用WHERE子句的簡單的語法:

String hql = "FROM Employee E WHERE E.id > 10 ORDER BY E.salary DESC";
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.firstName DESC, E.salary DESC ";
Query query = session.createQuery(hql);
List results = query.list();
登入後複製

如果想透過一個以上的屬性進行排序,你會僅僅是額外的屬性添加到由子句用逗號隔開,如下所示的命令的結尾:

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

GROUP BY 子句

該子句允許從Hibernate的它基於屬性的值的資料庫和群組提取訊息,並且通常使用結果包括總值。下面是一個使用GROUP BY子句的語法很簡單:

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

使用命名參數

Hibernate命名在其HQL查詢參數支援。這使得編寫接受來自使用者的輸入容易,不必對SQL注入攻擊防禦HQL查詢。以下是使用命名參數的簡單的語法:

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);
登入後複製

UPDATE 子句

批次更新是新的HQL與Hibernate3,以及不同的刪除工作,在Hibernate 3和Hibernate2一樣。 Query介面現在包含一個名為executeUpdate()方法用來執行HQL UPDATE或DELETE語句。

在UPDATE子句可以用來更新一個或多個物件中的一個或多個屬性。以下是使用UPDATE子句的簡單的語法:

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);
登入後複製

DELETE 子句

DELETE子句可以用來刪除一個或多個物件。下面是一個使用DELETE子句的簡單的語法:

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);
登入後複製

INSERT 子句

HQL支援INSERT INTO子句中只記錄在那裡可以插入從一個物件到另一個物件。以下是使用INSERT INTO子句的簡單的語法:

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

聚合方法

HQL支援多種聚合方法,類似於SQL。他們工作在HQL同樣的方式在SQL和下面的可用功能列表:

DISTINCT關鍵字只計算在該行設定的唯一值。下面的查詢將只傳回唯一的計數:

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

使用查詢分頁

有兩個用於分頁查詢介面的方法。

Query setFirstResult(int startPosition)

Query setMaxResults(int maxResult)

採用上述兩種方法一起,可以在網站或Swing應用程式建立一個分頁元件。下面是例子,可以擴充來取得10行:

Criteria cr = session.createCriteria(Employee.class);
List results = cr.list();
登入後複製

查詢條件

Hibernate提供了操作對象,並依序資料在RDBMS表可用的備用方式。其中一個方法是標準的API,它允許你建立一個標準的查詢物件編程,可以套用過濾規則和邏輯條件。

Hibernate的Session介面提供了可用於建立一個傳回的持久化物件的類別的實例時,應用程式執行一個條件查詢一個Criteria物件createCriteria()方法。

以下是最簡單的一個條件查詢的範例是將簡單地傳回對應於Employee類別的每個物件。

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

限制與標準:

可以使用add()方法可用於Criteria物件新增限制條件查詢。以下是例子增加一個限制與薪水返回的記錄是等於2000:

Criteria cr = session.createCriteria(Employee.class);
 
// To get records having salary more than 2000
cr.add(Restrictions.gt("salary", 2000));
 
// To get records having salary less than 2000
cr.add(Restrictions.lt("salary", 2000));
 
// To get records having fistName starting with zara
cr.add(Restrictions.like("firstName", "zara%"));
 
// Case sensitive form of the above restriction.
cr.add(Restrictions.ilike("firstName", "zara%"));
 
// To get records having salary in between 1000 and 2000
cr.add(Restrictions.between("salary", 1000, 2000));
 
// To check if the given property is null
cr.add(Restrictions.isNull("salary"));
 
// To check if the given property is not null
cr.add(Restrictions.isNotNull("salary"));
 
// To check if the given property is empty
cr.add(Restrictions.isEmpty("salary"));
 
// To check if the given property is not empty
cr.add(Restrictions.isNotEmpty("salary"));
可以创建AND或OR使用LogicalExpression限制如下条件:
 
Criteria cr = session.createCriteria(Employee.class);
 
Criterion salary = Restrictions.gt("salary", 2000);
Criterion name = Restrictions.ilike("firstNname","zara%");
 
// To get records matching with OR condistions
LogicalExpression orExp = Restrictions.or(salary, name);
cr.add( orExp );
 
 
// To get records matching with AND condistions
LogicalExpression andExp = Restrictions.and(salary, name);
cr.add( andExp );
 
List results = cr.list();
登入後複製

以下是幾個例子覆蓋不同的場景,並且可以根據要求使用:

Criteria cr = session.createCriteria(Employee.class);
cr.setFirstResult(1);
cr.setMaxResults(10);
List results = cr.list();
登入後複製
登入後複製


雖然上述所有條件,可以直接使用HQL在前面的教學中介紹。

分頁使用標準:🎜還有的標準接口,用於分頁的兩種方法。 🎜🎜public Criteria 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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

公司安全軟件導致應用無法運行?如何排查和解決? 公司安全軟件導致應用無法運行?如何排查和解決? Apr 19, 2025 pm 04:51 PM

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

如何使用MapStruct簡化系統對接中的字段映射問題? 如何使用MapStruct簡化系統對接中的字段映射問題? Apr 19, 2025 pm 06:21 PM

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

如何優雅地獲取實體類變量名構建數據庫查詢條件? 如何優雅地獲取實體類變量名構建數據庫查詢條件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

如何將姓名轉換為數字以實現排序並保持群組中的一致性? 如何將姓名轉換為數字以實現排序並保持群組中的一致性? Apr 19, 2025 pm 11:30 PM

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本啟動Spring...

Java對像如何安全地轉換為數組? Java對像如何安全地轉換為數組? Apr 19, 2025 pm 11:33 PM

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名構建查詢條件? 使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名構建查詢條件? Apr 19, 2025 pm 09:51 PM

在使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名以構建查詢條件,是一個常見的難題。本文將針...

電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? 電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? Apr 19, 2025 pm 11:27 PM

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

See all articles