看源码知道从hibernate5.2开始就已经不推荐使用这种方式了:
1、简单查询
package com.fengya.hibernate.demo1;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.query.Query;//这是要注意一下的!
import org.junit.Test;
import com.fengya.hibernate.domain.Customer;
import com.fengya.hibernate.utils.HibernateUtils;
/**
* QBC简单查询
*/
public class HIbernateDemo2 {
@Test
/**
* QBC简单查询
*/
public void testQBCQuery() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//获得Criteria的对象
// session.createCriteria(Customer.class);//已经过时
// 获得CriteriaBuilder 用来创建CriteriaQuery
CriteriaBuilder builder = session.getCriteriaBuilder();
// 创建CriteriaQuery 参数为返回结果类型
CriteriaQuery<Customer> criteria = builder.createQuery(Customer.class);
// 返会查询表 参数类型为要查询的持久类
Root<Customer> root = criteria.from(Customer.class);
// 设置where条件
criteria.where(builder.equal(root.get("cust_id"), 5L));
// 创建query 查询
Query<Customer> query = session.createQuery(criteria);
// 返回结果
Customer customer = query.getSingleResult();
System.out.println(customer);
tx.commit();
}
}
2、排序查询
@Test
/**
* QBC排序查询
*/
public void testQBCOrderQuery() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
CriteriaBuilder builder = session.getCriteriaBuilder();
// 参数为查询的结果类型
CriteriaQuery<Customer> criteria = builder.createQuery(Customer.class);
// 从什么表查询
Root<Customer> root = criteria.from(Customer.class);
//添加各种条件, 就是sql select 之后的语句
criteria.orderBy(builder.desc(root.get("cust_name")), builder.asc(root.get("cust_id")));
// 使用query 实现查询
Query<Customer> query = session.createQuery(criteria);
// 结果集
List<Customer> list = query.getResultList();
for (Customer customer : list) {
System.out.println("customer = " + customer);
}
tx.commit();
}
3、分页查询
@Test
/**
* QBC分页查询
*/
public void testQBCPaginationQuery() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
CriteriaBuilder builder = session.getCriteriaBuilder();
// 参数为查询的结果类型
CriteriaQuery<Customer> criteria = builder.createQuery(Customer.class);
// 从什么表查询
Root<Customer> root = criteria.from(Customer.class);
//添加各种条件, 就是sql select 之后的语句
criteria.orderBy(builder.desc(root.get("cust_name")));
//设置分页
int pageSize = 3;
int currentPage = 1;
int pageIndex = (currentPage - 1) * pageSize;
// 使用query 实现查询// 结果集
List<Customer> list = session.createQuery(criteria).setFirstResult(pageIndex).setMaxResults(pageSize).list();
for (Customer customer : list) {
System.out.println("customer = " + customer);
}
tx.commit();
}
4、条件查询
@Test
/**
* QBC条件查询
*/
public void testQBCConditionQuery() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
CriteriaBuilder builder = session.getCriteriaBuilder();
// 参数为查询的结果类型
CriteriaQuery<Customer> criteria = builder.createQuery(Customer.class);
// 从什么表查询
Root<Customer> root = criteria.from(Customer.class);
//添加各种条件, 就是sql select 之后的语句
criteria.select(root).where(builder.like(root.<String>get("cust_name"), "%天%"));
// 使用query 实现查询
Query<Customer> query = session.createQuery(criteria);
// 结果集
List<Customer> list = query.getResultList();
for (Customer customer : list) {
System.out.println("customer = " + customer);
}
tx.commit();
}
5、统计查询
@Test
/**
* QBC统计查询
*/
public void testQBCStatisticsQuery() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
CriteriaBuilder builder = session.getCriteriaBuilder();
// 参数为查询的结果类型
CriteriaQuery<Long> criteria = builder.createQuery(Long.class);
// 从什么表查询
Root<Customer> root = criteria.from(Customer.class);
// 就是sql select 之后的语句
criteria.select(builder.count(root));
// 使用query 实现查询
Query<Long> query = session.createQuery(criteria);
// 结果集
Long result = query.uniqueResult();
System.out.println("result = " + result);
tx.commit();
}
6、离线条件查询
@Test
/**
* QBC离线条件查询
*/
public void testQBCOutlineConditionQuery() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
DetachedCriteria dc = DetachedCriteria.forClass(Customer.class);//可能不在DAO中做,在web层可能就做过了这个工作,web层可以传 dc
dc.add(Restrictions.like("cust_name", "春%")); //不需要封装两次条件,尤其是做分页的时候,也可以传递 dc
Criteria criteria = dc.getExecutableCriteria(session);
List<Customer> list = criteria.list();
for (Customer customer : list) {
System.out.println("customer = " + customer);
}
tx.commit();
}