Hibernate:QBC查询

QBC:Query By Criteria

这是一种更加面向对象的查询方式,它把生成语句的过程全都融入到方法之中了(调用方法就生成sql语句,其中自动拼接字符串,自动解析xml文件,效率比HQL查询低)所以在Hibernate官网上,推荐的查询方式是HQL。

涉及的对象:Criteria接口

如何获取该对象:Criteria criteria = session.createCriteria(Class c);

方法中参数的含义:要查询的实体类字节码对象

接收查询结果方法

criteria.list():返回QBC查询语句的集合

criteria.uniqueResult():返回QBC查询语句的唯一结果对象

基本查询

public void baseQuery() {
	Session session = HibernateUtils.getCurrentSession();
	session.getTransaction().begin();
	Criteria criteria = session.createCriteria(Goods.class);
	List list = criteria.list();
	for (Object object : list) {
		System.out.println(object);
	}
	session.getTransaction().commit();
}

条件查询

criteria.add(Restrictions.eq("属性名称", "等于的值"));

public void criteriaQuery() {
	Session session = HibernateUtils.getCurrentSession();
	session.getTransaction().begin();
	Criteria criteria = session.createCriteria(Goods.class);
	criteria.add(Restrictions.eq("goodsName", "苹果"));// 使用Criteria对象的add方法添加条件
	List list = criteria.list();
	for (Object object : list) {
		System.out.println(object);
	}
	session.getTransaction().commit();
}

使用Criteria对象查询数据库

排序查询

criteria.addOrder(Order.desc("属性名"));

public void orderByQuery() {
	Session session = HibernateUtils.getCurrentSession();
	session.getTransaction().begin();
	Criteria criteria = session.createCriteria(Goods.class);
	criteria.addOrder(Order.desc("goodsPrice"));
	List list = criteria.list();
	for (Object object : list) {
		System.out.println(object);
	}
	session.getTransaction().commit();
}

分页查询

criteria.setFirstResult(0);设置查询开始记录的索引

criteria.setMaxResults(2);设置每次查询的条数

public void limitQuery() {
	Session session = HibernateUtils.getCurrentSession();
	session.getTransaction().begin();
	Criteria criteria = session.createCriteria(Goods.class);
	criteria.setFirstResult(0);
	criteria.setMaxResults(2);
	List list = criteria.list();
	for (Object object : list) {
		System.out.println(object);
	}
	session.getTransaction().commit();
}

统计查询

public void countQuery() {
	Session session = HibernateUtils.getCurrentSession();
	session.getTransaction().begin();
	Criteria criteria = session.createCriteria(Goods.class);
	criteria.setProjection(Projections.count("goodsId"));// 根据字段查询总条数
	Long count = (Long) criteria.uniqueResult();
	System.out.println(count);
	session.getTransaction().commit();
}

离线查询

多条件查询时,我们需要为方法内传参,因为条件是多个,所以参数也是很多个,此时我们将所有参数封装到Criteria对象中,但是session是单线程,一个session只能有一个Criteria对象,所以我们用DetachedCriteria对象代替Criteria对象封装条件参数,这就叫离线查询

private List dao(DetachedCriteria dc) {
	Session session = HibernateUtils.getCurrentSession();
	Criteria criteria = dc.getExecutableCriteria(session);// 把离线对象转成在线对象
	return criteria.list();
}
private List service(DetachedCriteria dc) {
	Session session = null;
	Transaction tx = null;
	try {
		session = HibernateUtils.getCurrentSession();
		tx = session.beginTransaction();
		List list = dao(dc);
		tx.commit();
		return list;
	} catch (Exception e) {
		tx.rollback();
	}
	return null;
}
public void servlet() {
	// 获取离线对象,不需要Session
	DetachedCriteria dc = DetachedCriteria.forClass(Goods.class);
	// 封装查询对象
	dc.add(Restrictions.gt("goodsPrice", 10F));
	dc.add(Restrictions.lt("goodsPrice", 30F));
	List list = service(dc);
	for (Object object : list) {
		System.out.println(object);
	}
}
发布了202 篇原创文章 · 获赞 37 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/lovecuidong/article/details/99680911