QBC(Query By Criteria) 查询方式

这种方式比较面向对象方式,重点是有三个描述条件的对象:Restrictions,Order,Projections。使用QBC查询,一般需要以下三个步骤:

1.使用Session实例 的createCriteria()方法创建Criteria对象
2.使用工具类Restrictions的方法为Criteria对象设置查询条件,Order工具类的方法设置排序方式,Projections工具类的方法进行统计和分组。
3.使用Criteria对象的list()方法进行查询并返回结果

Restrictions类的常用方法:

方法名称

描述

Restrictions.eq

等于

Restrictions.allEq

使用Map,Key/Valu进行多个等于的比对

​Restrictions.gt​

大于

​Restrictions.ge​

大于等于

​Restrictions.lt​

小于

Restrictions.le

小于等于

Restrictions.between

对应SQL的between

Restrictions.like

对应SQL的like

​Restrictions.in​

对应SQL的in

Restrictions.and

and关系

Restrictions.or

or关系

Restrictions.sqlRestriction

SQL限定查询

Order类的常用方法:

方法名称

描述

Order.asc

升序

Order.desc

降序

Projections类的常用方法

方法名称

描述

Projections.avg

求平均值

Projections.count

统计某属性的数量

Projections.countDistinct

统计某属性不同值的数量

Projections.max

求最大值

Projections.min

求最小值

Projections.projectionList

创建一个ProjectionList对象

Projections.rowCount

查询结果集中的记录条数

Projections.sum

求某属性的合计

例1: 查询出所有的顾客信息

Criteria criteria = session.createCriteria(Customer.class);
List<Customer> customers = criteria.list();
for(Customer cus : customers){
System.out.println(cus);
}

例2: 查询符合条件的顾客的信息(年龄大于12)

Criteria criteria = session.createCriteria(Customer.class);
criteria.add(Restrictions.gt("age", 12));
List<Customer> customers = criteria.list();
for(Customer cus : customers){
System.out.println(cus);
}

例3: 查询名字在"terry,larry,tom"之间的用户的信息

Session session = HibernateSessionFactory.getSession();
Transaction tran = session.beginTransaction();
String[] names = {"terry","larry","tom"};
Criteria criteria = session.createCriteria(Customer.class);
criteria.add(Restrictions.in("name", names));
List<Customer> customers = criteria.list();
for(Customer cus : customers){
System.out.println(cus);
}

Order 排序

criteria.addOrder() 添加排序约束
Order.desc("id") 按照id降序排列
Order.asc("id") 按照id升序排列

QBC 离线条件查询

离线条件查询使用的是 DetachedCriteria 接口进行查询,离线条件查询对象在创建的时候不需要使用 Session 对象,在添加条件 时也不需要 Session 对象,只有在查询的时候使用 Session 对象即可,所以叫做离线条件查询。

为什么要有离线条件查询?

一般情况下,在业务层开启 Session 后,在持久层对数据进行操作,而在 web 层需要接收条件查询的若干条件,所以在 web 层就设置条件会很方便,又因为 Criteria 需要由 Session 创建,所以无法在 web 层设置条件,于是离线条件查询出现了。

创建离线条件查询对象

DetachedCriteria criteria = DetachedCriteria.forClass(Linkman.class);

具体的代码如下,注意顺序,这样是可行的

DetachedCriteria criteria = DetachedCriteria.forClass(Linkman.class);
// 设置查询条件
criteria.add(Restrictions.eq("lkm_gender", "男"));

Session session = HibernateUtils.getCurrentSession();
Transaction tr = session.beginTransaction();

// 查询数据
List<Linkman> list = criteria.getExecutableCriteria(session).list();
for (Linkman linkman : list) {
System.out.println(linkman);
}
tr.commit();

QBE(Query By Example)查询方式

将一个对象的非空属性作为查询条件进行查询。

示例:

1: Session session = SessionFactory.getCurrentSession();
2: User user = new User();
3: user.setName("ijse");
4: Transaction ts = session.beginTransaction();
5: try {
6: Criteria criteria = session.createCriteria(User.class);
7: criteria.add(Example.create(user));
8: user= (User) criteria.list().get(0);
9: session.commit();
10: } catch (HibernateException ex) {
11: ts.rollBack();
12: ex.printStackTrace();
13: }
14: System.out.println(user.getName());

参考文章如下:

https://www.jianshu.com/p/242a08e1d3e9

https://www.jianshu.com/p/21bcb31ea80e