搜索
首页Javajava教程在Java的Hibernate框架中对数据库数据进行查询操作

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子句可以用来别名分配给类中的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对象的一个属性,而不是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();

如果想通过一个以上的属性进行排序,你会仅仅是额外的属性添加到由子句用逗号隔开,如下所示的命令的结尾:

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();

GROUP BY 子句
该子句允许从Hibernate的它基于属性的值的数据库和组提取信息,并且通常使用结果包括总值。下面是一个使用GROUP BY子句的语法很简单:

String hql = "SELECT SUM(E.salary), E.firtName FROM Employee E " +
       "GROUP 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();

UPDATE 子句
批量更新是新的HQL与Hibernate3,以及不同的删除工作,在Hibernate 3和Hibernate2一样。 Query接口现在包含一个名为executeUpdate()方法用于执行HQL UPDATE或DELETE语句。

在UPDATE子句可以用于更新一个或多个对象中的一个或多个属性。下面是一个使用UPDATE子句的简单的语法:

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);

DELETE 子句
DELETE子句可以用来删除一个或多个对象。下面是一个使用DELETE子句的简单的语法:

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);

INSERT 子句
HQL支持INSERT INTO子句中只记录在那里可以插入从一个对象到另一个对象。以下是使用INSERT INTO子句的简单的语法:

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);

聚合方法
HQL支持多种聚合方法,类似于SQL。他们工作在HQL同样的方式在SQL和下面的可用功能列表:

DISTINCT关键字只计算在该行设定的唯一值。下面的查询将只返回唯一的计数:

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

使用查询分页
有用于分页查询接口的两个方法。

Query setFirstResult(int startPosition)

Query setMaxResults(int maxResult)

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

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

查询条件
Hibernate提供了操作对象,并依次数据在RDBMS表可用的备用方式。其中一个方法是标准的API,它允许你建立一个标准的查询对象编程,可以套用过滤规则和逻辑条件。
Hibernate的Session接口提供了可用于创建一个返回的持久化对象的类的实例时,应用程序执行一个条件查询一个Criteria对象createCriteria()方法。

以下是最简单的一个条件查询的例子是将简单地返回对应于Employee类的每个对象。

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

限制与标准:
可以使用add()方法可用于Criteria对象添加限制条件查询。下面是例子增加一个限制与薪水返回的记录是等于2000:

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

以下是几个例子覆盖不同的场景,并且可以根据要求使用:

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();

虽然上述所有条件,可以直接使用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
如何使用咖啡因或Guava Cache等库在Java应用程序中实现多层缓存?如何使用咖啡因或Guava Cache等库在Java应用程序中实现多层缓存?Mar 17, 2025 pm 05:44 PM

本文讨论了使用咖啡因和Guava缓存在Java中实施多层缓存以提高应用程序性能。它涵盖设置,集成和绩效优势,以及配置和驱逐政策管理最佳PRA

如何在Java中实施功能编程技术?如何在Java中实施功能编程技术?Mar 11, 2025 pm 05:51 PM

本文使用lambda表达式,流API,方法参考和可选探索将功能编程集成到Java中。 它突出显示了通过简洁性和不变性改善代码可读性和可维护性等好处

Java的类负载机制如何起作用,包括不同的类载荷及其委托模型?Java的类负载机制如何起作用,包括不同的类载荷及其委托模型?Mar 17, 2025 pm 05:35 PM

Java的类上载涉及使用带有引导,扩展程序和应用程序类负载器的分层系统加载,链接和初始化类。父代授权模型确保首先加载核心类别,从而影响自定义类LOA

如何将JPA(Java持久性API)用于具有高级功能(例如缓存和懒惰加载)的对象相关映射?如何将JPA(Java持久性API)用于具有高级功能(例如缓存和懒惰加载)的对象相关映射?Mar 17, 2025 pm 05:43 PM

本文讨论了使用JPA进行对象相关映射,并具有高级功能,例如缓存和懒惰加载。它涵盖了设置,实体映射和优化性能的最佳实践,同时突出潜在的陷阱。[159个字符]

如何将Maven或Gradle用于高级Java项目管理,构建自动化和依赖性解决方案?如何将Maven或Gradle用于高级Java项目管理,构建自动化和依赖性解决方案?Mar 17, 2025 pm 05:46 PM

本文讨论了使用Maven和Gradle进行Java项目管理,构建自动化和依赖性解决方案,以比较其方法和优化策略。

如何将Java的Nio(新输入/输出)API用于非阻滞I/O?如何将Java的Nio(新输入/输出)API用于非阻滞I/O?Mar 11, 2025 pm 05:51 PM

本文使用选择器和频道使用单个线程有效地处理多个连接的Java的NIO API,用于非阻滞I/O。 它详细介绍了过程,好处(可伸缩性,性能)和潜在的陷阱(复杂性,

如何使用适当的版本控制和依赖项管理创建和使用自定义Java库(JAR文件)?如何使用适当的版本控制和依赖项管理创建和使用自定义Java库(JAR文件)?Mar 17, 2025 pm 05:45 PM

本文使用Maven和Gradle之类的工具讨论了具有适当的版本控制和依赖关系管理的自定义Java库(JAR文件)的创建和使用。

如何使用Java的插座API进行网络通信?如何使用Java的插座API进行网络通信?Mar 11, 2025 pm 05:53 PM

本文详细介绍了用于网络通信的Java的套接字API,涵盖了客户服务器设置,数据处理和关键考虑因素,例如资源管理,错误处理和安全性。 它还探索了性能优化技术,我

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。