hibernate查询方式总结(四)之QBC,QBE查询

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

猜你喜欢

转载自blog.csdn.net/lin819747263/article/details/85082107