hibernate的高级查询方式除了使用HQL、原生SQL的方式外,还提供了一套条件查询的接口(QBC),其隐藏了HQL和SQL的细节,用好条件查询,有时事半功倍,以下对常用方法做个小结。
1、创建Criteria
使用QBC查询,首先需要创建Criteria,后面通过对Criteria追加约束完成查询条件的设置。通过session创建,只需要通过映射的POJO类型作为参数即可创建:
- Criteria criteria = session.createCriteria(Order.class);
2、基本条件查询
通过创建约束Restrictions,来设置匹配条件,下面只列出几个常用的匹配,可以参见hibernate的API有更多匹配约束
- // 基本匹配
- criteria.add(Restrictions.eq("name", nameStr));
- criteria.add(Restrictions.ge("id", 10));
- criteria.add(Restrictions.le("id", 10));
- // 模糊查询
- criteria.add(Restrictions.like("name", nameStr));
- // 模糊查询,不区分大小写
- criteria.add(Restrictions.ilike("name", nameStr));
- // in匹配 OrderItemSet要求序列化,可以使用HashSet
- criteria.add(Restrictions.in("name", nameSet));
3、主键查询
代理主键:
- criteria.add(Restrictions.idEq(10));
自然主键:
虽然hibernate不推荐使用,但有些业务场景的唯一标识通常是指定位数的字符序列,且会用其作为自然主键。
- //自然主键查询
- NaturalIdentifier identifier = Restrictions.naturalId();
- identifier.set("uuid", uuidStr);
- criteria.add(identifier);
- criteria.setCacheable(true);
- Order oredr = (Order)criteria.uniqueResult();
4、获取记录数
有时只想获取记录数,而不需要获取整个记录集
- criteria.setProjection(Projections.rowCount());
- long size = (Long)criteria.list().get(0);
5、设置抓取方式
在映射POJO时通常会将关联设置为延迟加载,即lazy=true,这样会减少大数据抓取时的性能消耗,但有时查询时又需要获取关联数据,使用QBC可以动态修改抓取策略:
- // 动态抓取设置
- criteria.setFetchMode("orderItemSet", FetchMode.JOIN);
orderItemSet 为POJO中关系映射属性名,例如在经典的Order和OrderItem的例子中,订单与订单项间的映射是一对多关系,那么在Order的POJO中会持有一个OrderItem的聚集,通常会用一个Set,如:
- Set<OrderItem> orderItemSet = new HashSet<OrderItem>();