目录
HQL查询
Hibernate 查询语言(HQL)是一种面向对象的查询语言,类似于 SQL,但不是去对表和列进行操作,而是面向对象和它们的属性。 HQL 查询被 Hibernate 翻译为传统的 SQL 查询从而对数据库进行操作。
尽管你能直接使用本地 SQL 语句,但我还是建议你尽可能的使用 HQL 语句,以避免数据库关于可移植性的麻烦,并且体现了 Hibernate 的 SQL 生成和缓存策略。
在 HQL 中一些关键字比如 SELECT ,FROM 和 WHERE 等,是不区分大小写的,但是一些属性比如表名和列名是区分大小写的。
from语句:
String hql="from employee";
//String hql = "FROM com.hibernatebook.criteria.Employee";
Query query=session.createQuery(hql);
List result=query.list();
AS语句:
在 HQL 中 AS 语句能够用来给你的类分配别名,尤其是在长查询的情况下
String hql="from Employee AS E";
Query query=session.createQuery(hql);
List requests=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();
Where语句:
String hql = "FROM Employee E WHERE E.id = 10";
Query query = session.createQuery(hql);
List results = query.list();
order by语句: 。。。。
使用命名参数
Hibernate 的 HQL 查询功能支持命名参数。这使得 HQL 查询功能既能接受来自用户的简单输入,又无需防御 SQL 注入攻击。下面是使用命名参数的简单的语法:
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 Hibernate 3 较 HQL Hibernate 2,新增了批量更新功能和选择性删除工作的功能。查询接口包含一个 executeUpdate() 方法,可以执行 HQL 的 UPDATE 或 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);
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);
分页查询
Query setFirstResult(int startPosition)
该方法以一个整数表示结果中的第一行,从 0 行开始。
Query setMaxResults(int maxResult)
这个方法告诉 Hibernate 来检索固定数量,即 maxResults 个对象。 例如:
String hql = "FROM Employee";
Query query = session.createQuery(hql);
query.setFirstResult(1);
query.setMaxResults(10);
List results = query.list();
标准查询(Criteria查询:):
用于单表查询;
Hibernate 提供了操纵对象和相应的 RDBMS 表中可用的数据的替代方法。一种方法是标准的 API,它允许你建立一个标准的可编程查询对象来应用过滤规则和逻辑条件。
Hibernate Session 接口提供了 createCriteria() 方法,可用于创建一个 Criteria 对象,使当您的应用程序执行一个标准查询时返回一个持久化对象的类的实例。
例如:
Criteria cr = session.createCriteria(Employee.class);
List results = cr.list();
你可以使用 Criteria 对象可用的 add() 方法去添加一个标准查询的限制。
例如:
Criteria cr = session.createCriteria(Employee.class);
cr.add(Restrictions.eq("salary", 2000)); //where精确查询
cr.add(Restrictions.like("firstName", "zara%"));//模糊查询
cr.add(Restrictions.between("salary", 1000, 2000));//范围查询
cr.add(Restrictions.isEmpty("salary"));//判空
List results = cr.list();
分页:
Criteria cr = session.createCriteria(Employee.class);
cr.setFirstResult(1);
cr.setMaxResults(10);
List results = cr.list();
原生SQL
复杂的业务逻辑的时候还是需要用这个的如果你想使用数据库特定的功能如查询提示或 Oracle 中的 CONNECT 关键字的话,你可以使用原生 SQL 数据库来表达查询。Hibernate 3.x 允许您为所有的创建,更新,删除,和加载操作指定手写 SQL ,包括存储过程。
您的应用程序会在会话界面用 createSQLQuery() 方法创建一个原生 SQL 查询:
public SQLQuery createSQLQuery(String sqlString) throws HibernateException当你通过一个包含 SQL 查询的 createsqlquery() 方法的字符串时,你可以将 SQL 的结果与现有的 Hibernate 实体,一个连接,或一个标量结果分别使用 addEntity(), addJoin(), 和 addScalar() 方法进行关联。
标量查询:
最基本的 SQL 查询是从一个或多个列表中获取一个标量(值)列表。
String sql = "SELECT first_name, salary FROM EMPLOYEE";
SQLQuery query = session.createSQLQuery(sql);
query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List results = query.list();
实体查询:
以上的查询都是关于返回标量值的查询,只是基础性地返回结果集中的“原始”值。以下是从原生 SQL 查询中通过 addEntity() 方法获取实体对象整体的语法:
String sql = "SELECT * FROM EMPLOYEE";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(Employee.class);
List results = query.list();
指定Sql查询:
通过 addEntity() 方法和使用指定 SQL 查询来获取实体对象整体的语法:
String sql = "SELECT * FROM EMPLOYEE WHERE id = :employee_id";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(Employee.class);
query.setParameter("employee_id", 10);
List results = query.list();
package com.leo.api;
import java.util.List;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import com.leo.domain.Customer;
/**
* hibernate自己的 用于多表查询但不复杂时用
* @author leoi555
*
*/
public class HQLDemo {
//查询
public void test1() {
//1.创建
Configuration cof=new Configuration().configure();
//2.获得session工厂
SessionFactory factory=cof.buildSessionFactory();
//3.创建session
Session session=factory.openSession();
//4.开启事务
Transaction beginTransaction = session.beginTransaction();
//操作语句
String hql="from Customer";
//条件查询1:对应的对象的属性
String hql1="from Customer where cust_id=?";
//条件查询2::id,是占位符,和站位符名字
String hql2="from Customer where cust_id=:id";
//创建查询对象
Query query=session.createQuery(hql);
//:1设置方式:是从下表为0的
query.setParameter(0, 1l);
:2设置方式:
query.setParameter("id", 1l);
//单个值:
//query.uniqueResult();
//多个对象的形式
List<Customer> list = query.list();
System.out.println(list);
beginTransaction.commit();
session.close();//托管状态
factory.close();
}
/**
* 分页查询
*/
public void test2() {
//1.创建
Configuration cof=new Configuration().configure();
//2.获得session工厂
SessionFactory factory=cof.buildSessionFactory();
//3.创建session
Session session=factory.openSession();
//4.开启事务
Transaction beginTransaction = session.beginTransaction();
//操作语句
String hql="from Customer";
Query createQuery = session.createQuery(hql);
//设置分页信息
createQuery.setFirstResult(0);
createQuery.setMaxResults(3);
List<Customer> list = createQuery.list();
System.out.println(list);
beginTransaction.commit();
session.close();//托管状态
factory.close();
}
/**
* 排序
*/
public void test3() {
//1.创建
Configuration cof=new Configuration().configure();
//2.获得session工厂
SessionFactory factory=cof.buildSessionFactory();
//3.创建session
Session session=factory.openSession();
//4.开启事务
Transaction beginTransaction = session.beginTransaction();
//操作语句
String hql="from Customer order by cust_id asc";
Query createQuery = session.createQuery(hql);
List<Customer> list = createQuery.list();
System.out.println(list);
beginTransaction.commit();
session.close();//托管状态
factory.close();
}
/**
* 条件查询
*/
public void test4() {
//1.创建
Configuration cof=new Configuration().configure();
//2.获得session工厂
SessionFactory factory=cof.buildSessionFactory();
//3.创建session
Session session=factory.openSession();
//4.开启事务
Transaction beginTransaction = session.beginTransaction();
String sql="select * from Customer where cust_id=?";
Query query=session.createSQLQuery(sql);
query.setParameter(0,1l);
//指定将结果封装到哪个实体中;
List<Customer> list=query.list();
System.out.println(list);
beginTransaction.commit();
session.close();//托管状态
factory.close();
}
/**
* 统计查询
* count,avg,max,min,sum函数查询
*/
public void test5() {
//1.创建
Configuration cof=new Configuration().configure();
//2.获得session工厂
SessionFactory factory=cof.buildSessionFactory();
//3.创建session
Session session=factory.openSession();
//4.开启事务
Transaction beginTransaction = session.beginTransaction();
String sql="select count(*) from Customer";
Query query=session.createSQLQuery(sql);
//用Number类型来接受
Number count=(Number) query.uniqueResult();
System.out.println(count);
beginTransaction.commit();
session.close();//托管状态
factory.close();
}
/**
* 投影查询
*/
public void test6() {
//1.创建
Configuration cof=new Configuration().configure();
//2.获得session工厂
SessionFactory factory=cof.buildSessionFactory();
//3.创建session
Session session=factory.openSession();
//4.开启事务
Transaction beginTransaction = session.beginTransaction();
//new Customer(cust_id,cust_name);要加入构造方法,和空参构造
String sql="select new Customer(cust_id,cust_name) from Customer";
Query query=session.createSQLQuery(sql);
//用Number类型来接受
Number count=(Number) query.uniqueResult();
System.out.println(count);
beginTransaction.commit();
session.close();//托管状态
factory.close();
}
}
package com.leo.api;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.leo.domain.Customer;
/**
* 原生的查询
* @author leoi555
*
*/
public class SqlDemo {
/**
* 查询
*/
public void test1() {
//1.创建
Configuration cof=new Configuration().configure();
//2.获得session工厂
SessionFactory factory=cof.buildSessionFactory();
//3.创建session
Session session=factory.openSession();
//4.开启事务
Transaction beginTransaction = session.beginTransaction();
String sql="select * from customer";
SQLQuery query=session.createSQLQuery(sql);
//指定将结果封装到哪个实体中;
query.addEntity(Customer.class);
List<Customer> list=query.list();
// List<Object[]> list = query.list();
// for(Object obj: list) {
// System.out.println(obj);
// }
beginTransaction.commit();
session.close();//托管状态
factory.close();
}
/**
* 条件查询
*/
public void test2() {
//1.创建
Configuration cof=new Configuration().configure();
//2.获得session工厂
SessionFactory factory=cof.buildSessionFactory();
//3.创建session
Session session=factory.openSession();
//4.开启事务
Transaction beginTransaction = session.beginTransaction();
String sql="select * from customer where cust_id=?";
SQLQuery query=session.createSQLQuery(sql);
query.setParameter(0,1l);
//指定将结果封装到哪个实体中;
query.addEntity(Customer.class);
List<Customer> list=query.list();
System.out.println(list);
beginTransaction.commit();
session.close();//托管状态
factory.close();
}
/**
* 分页
*/
public void test3() {
//1.创建
Configuration cof=new Configuration().configure();
//2.获得session工厂
SessionFactory factory=cof.buildSessionFactory();
//3.创建session
Session session=factory.openSession();
//4.开启事务
Transaction beginTransaction = session.beginTransaction();
String sql="select * from customer limit ?,?";
SQLQuery query=session.createSQLQuery(sql);
//前三页
query.setParameter(0,0);
query.setParameter(1, 2);
//指定将结果封装到哪个实体中;
query.addEntity(Customer.class);
List<Customer> list=query.list();
System.out.println(list);
beginTransaction.commit();
session.close();//托管状态
factory.close();
}
}