QBC的检索方式
Query By Criteria。条件查询中用得比较多。因为hql中做条件查询的话,写hql语句稍微有点麻烦,QBC就很方便了。
/**
* 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的分页和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 或者
/**
* 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();
}
/**
* 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();
}
/**
* 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();
}
/**
* 判断值是否为空
*/
@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();
}
离线条件查询使用的是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();
}