hibernate框架的查询方式QBC(二十)

QBC的检索方式

Query By Criteria。条件查询中用得比较多。因为hql中做条件查询的话,写hql语句稍微有点麻烦,QBC就很方便了。

hibernate框架的查询方式QBC(二十)_第1张图片

一、基本演示

	/**
	 * QBC的查询,基本演示
	 */
	@Test
	public void run1() {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();

		// 创建QBC查询接口
		Criteria criteria = session.createCriteria(Linkman.class);
		List list = criteria.list();

		for (Linkman linkman : list) {
			System.out.println(linkman);
		}

		tx.commit();
	}

二、排序

	/**
	 * QBC的查询,排序
	 */
	@Test
	public void run2() {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();

		// 创建QBC查询接口
		Criteria criteria = session.createCriteria(Linkman.class);

		// 调用排序的方法, addOrder()
		criteria.addOrder(Order.desc("lkm_id"));
		
		List list = criteria.list();
		for (Linkman linkman : list) {
			System.out.println(linkman);
		}

		tx.commit();
	}

三、分页

QBC的分页查询也是使用两个方法
setFirstResult();
setMaxResults();
	/**
	 * QBC的分页和HQL的分页方式是一样的
	 */
	@Test
	public void run3() {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();

		// 创建QBC查询接口
		Criteria criteria = session.createCriteria(Linkman.class);

		// 设置分页的方法
		criteria.setFirstResult(0);
		criteria.setMaxResults(3);

		List list = criteria.list();
		for (Linkman linkman : list) {
			System.out.println(linkman);
		}

		tx.commit();
	}

四、条件查询

条件查询(Criterion是查询条件的接口,Restrictions类是Hibernate框架提供的工具类,使用该工具类来设置查询条件)
* 条件查询使用Criteria接口的add方法,用来传入条件。
* 使用Restrictions的添加条件的方法,来添加条件,例如:
* Restrictions.eq   相等
* Restrictions.gt    大于号
* Restrictions.ge   大于等于
* Restrictions.lt   小于
* Restrictions.le   小于等于
* Restrictions.between   在之间
* Restrictions.like   模糊查询
* Restrictions.in   范围
* Restrictions.and  并且
* Restrictions.or  或者

4.1 简单条件

	/**
	 * QBC的条件查询
	 */
	@Test
	public void run4() {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();

		// 创建QBC查询接口
		Criteria criteria = session.createCriteria(Linkman.class);

		// 使用方法添加条件
		criteria.add(Restrictions.eq("lkm_gender", "male"));
		criteria.add(Restrictions.ge("lkm_id", 3L));

		List list = criteria.list();
		for (Linkman linkman : list) {
			System.out.println(linkman);
		}

		tx.commit();
	}

4.2 in查询

	/**
	 * in查询
	 */
	@Test
	public void run5() {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();

		// 创建QBC查询接口
		Criteria criteria = session.createCriteria(Linkman.class);

		// SQL: select * from cst_linkman where lkm_id in (1 ,2 ,7);
		List params = new ArrayList<>();
		params.add(1L);
		params.add(2L);
		params.add(7L);
		criteria.add(Restrictions.in("lkm_id", params));

		List list = criteria.list();
		for (Linkman linkman : list) {
			System.out.println(linkman);
		}

		tx.commit();
	}

4.3 or方法

	/**
	 * or方法
	 */
	@Test
	public void run6() {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();

		// 创建QBC查询接口
		Criteria criteria = session.createCriteria(Linkman.class);

		// SQL:select * from cst_linkman where lkm_gender = "female" or lkm_id > 3L;
		criteria.add(Restrictions.or(Restrictions.eq("lkm_gender", "female"), Restrictions.gt("lkm_id", 3L)));

		List list = criteria.list();
		for (Linkman linkman : list) {
			System.out.println(linkman);
		}

		tx.commit();
	}

4.4 判断值是否为空

	/**
	 * 判断值是否为空
	 */
	@Test
	public void run7() {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();

		// 创建QBC查询接口
		Criteria criteria = session.createCriteria(Linkman.class);

		// 找所有的email是空的值
		criteria.add(Restrictions.isNull("lkm_email"));

		List list = criteria.list();
		for (Linkman linkman : list) {
			System.out.println(linkman);
		}

		tx.commit();
	}

五、聚合函数

聚合函数查询(Projection的聚合函数的接口,而Projections是Hibernate提供的工具类,使用该工具类设置聚合函数查询)

使用QBC的聚合函数查询,需要使用criteria.setProjection()方法

	/**
	 * 聚合函数的查询
	 */
	@Test
	public void run8() {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		// 创建QBC查询接口
		Criteria criteria = session.createCriteria(Linkman.class);
		// 设置聚合函数的方式
		List list = criteria.setProjection(Projections.count("lkm_id")).list();
		Long count = list.get(0).longValue();
		System.out.println(count);

		tx.commit();
	}

注意,select count(*) from 表,又想查select * from 表,存在问题

	/**
	 * 聚合函数的查询:注意,select count(*) from 表,又想查select * from 表,存在问题
	 */
	@Test
	public void run9() {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		// 创建QBC查询接口
		Criteria criteria = session.createCriteria(Linkman.class);
		// 设置聚合函数的方式
		criteria.setProjection(Projections.count("lkm_id"));
		List list = criteria.list();
		Long count = list.get(0).longValue();
		System.out.println(count);

		// 再设置一遍setProjection方法
		criteria.setProjection(null);

		// 继续查询所有的联系人
		List mans = criteria.list();
		for (Linkman man : mans) {
			System.out.println(man);
		}

		tx.commit();
	}

六、离线条件查询对象

hibernate框架的查询方式QBC(二十)_第2张图片

离线条件查询使用的是DetachedCriteria接口进行查询,离线条件查询对象在创建的时候,不需要使用Session对象,只是在查询的时候使用Session对象即可。
创建离线条件查询对象
DetachedCriteria criteria = DetachedCriteria.forClass(Linkman.class);

	/**
	 * 离线条件查询
	 */
	@Test
	public void run10() {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();

		// 创建离线条件查询的对象
		DetachedCriteria criteria = DetachedCriteria.forClass(Linkman.class);
		// 添加查询的条件
		criteria.add(Restrictions.eq("lkm_gender", "female"));
		// 创建脱离session,查询的时候需要session。因为有session才能操作数据库嘛
		List list = criteria.getExecutableCriteria(session).list();
		for (Linkman linkman : list) {
			System.out.println(linkman);
		}

		tx.commit();
	}


你可能感兴趣的:(Hibernate)