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://blog.csdn.net/iijse/article/details/6161143
https://www.jianshu.com/p/242a08e1d3e9
https://www.jianshu.com/p/21bcb31ea80e
https://blog.csdn.net/iijse/article/details/6161143