-
查询方式
HQL SQL QBC(query by criteria)
-
理解
org.hibernate.Criteria实际上是个条件附加的容器,如果想要设定查询条件,则要使用org.hibernate.criterion.Restrictions的各种静态方法传回org.hibernate.criterion.Criterion实例,传回的每个org.hibernate.criterion.Criteria实例代表着一个条件,你要使用org.hibernate.Criteria的add()方法加入这些条件实例。
-
QBC查询的基本步骤
这种方式比较面向对象方式,重点是有三个描述条件的对象:Restrictions,Order,Projections。使用QBC查询,一般需要以下三个步骤:
- 使用Session实例的createCriteria()方法创建Criteria对象;
- 使用工具类Restrictions的方法为Criteria对象设置查询条件,Order工具类的方法设置排序方式,Projections工具类的方法进行统计和分组;
- 使用Criteria对象的list()方法进行查询并返回结果。
具体:
- Criteria创建 --> session.createCriteria(Class persistentClass) (更多重载参考)
- 条件添加 --> add(Criterion criterion) 限定条件、 addOrder(Order order) 限定顺序、 setProjection(Projection projection) 限定统计动作
- 结果返回 --> list()
-
Restrictions、Order、Projections的常用方法
Restrictions类的常用方法(设置查询条件):
返回值类型 | 方法名称 | 描述 |
SimpleExpression | Restrictions.eq | 等于(equal) |
Criterion | Restrictions.allEq | 使用Map,Key/Valu进行多个等于的比对 |
SimpleExpression | Restrictions.gt | 大于(great than) |
SimpleExpression | Restrictions.ge | 大于等于(great than or equal) |
SimpleExpression | Restrictions.lt | 小于(less than) |
SimpleExpression | Restrictions.le | 小于等于(less than or equal) |
Criterion | Restrictions.between | 对应SQL的between |
SimpleExpression | Restrictions.like | 对应SQL的like |
Criterion | Restrictions.in | 对应SQL的in |
LogicalExpression | Restrictions.and | and关系 |
LogicalExpression | Restrictions.or | or关系 |
Criterion | Restrictions.isNull | 为空 |
Criterion | Restrictions.sqlRestriction | SQL限定查询 |
Order类的常用方法(设置排序方式):
返回值类型 | 方法名称 | 描述 |
Order | Order.asc | 升序 |
Order | Order.desc | 降序 |
Projections类的常用方法(统计和分组):
返回值类型 | 方法名称 | 描述 |
AggregateProjection | Projections.avg | 求平均值 |
CountProjection | Projections.count | 统计某属性的数量 |
CountProjection | Projections.countDistinct | 统计某属性不同值的数量 |
PropertyProjection | Projections.groupProperty | 指定某个属性为分组属性 |
AggregateProjection | Projections.max | 求最大值 |
AggregateProjection | Projections.min | 求最小值 |
ProjectionList | Projections.projectionList | 创建一个ProjectionList对象 |
Projection | Projections.rowCount | 查询结果集中的记录条数 |
AggregateProjection | Projections.sum | 求某属性的合计 |
-
OR查询
//查找age等于(eq)20或(or)age为空(isNull)的User
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.or( Restrictions.eq("age", new Integer(20)), Restrictions.isNull("age") ));
List users = criteria.list();
//实际上它产生的对应的sql如下
Hibernate:
select
this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_
from
T_USER this_
where
(this_.age=? or this_.age is null)
- Projections用法
DetachedCriteria dc = this.createDetachedCriteria();
dc.add(Restrictions.eq(type, type));
dc.setProjection(Projections.distinct(Projections.property("label")));//排除重复
Hibernate的Projections工厂类包含了以下几个常用的统计函数:
① avg(String propertyName):计算属性字段的平均值。
② count(String propertyName):统计一个属性在结果中出现的次数。
③ countDistinct(String propertyName):统计属性包含的不重复值的数量。
④ max(String propertyName):计算属性值的最大值。
⑤ min(String propertyName):计算属性值的最小值。
⑥ sum(String propertyName):计算属性值的总和。
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.eq("depart", "depart1"));
criteria.setProjection(Projections.count("id"));
Long count = (Long)criteria.uniqueResult();
类似于sql:
select count(id) from user where depart = depart1
查询出来的结果:
count
1231
Criteria Crit = getSession().createCriteria(Product.class);
ProjectionList projList = Projections.projectionList();
projList.add(Projections.max("price"));
projList.add(Projections.min("price"));
projList.add(Projections.avg("price"));
projList.add(Projections.maxDistinct("price")); //执行给max函数去重
Crit.setProjection(projList);
List result = Crit.list();
类似:
select max(distinct price),min(price),avg(price) from product
查询depart1部门的人数, 这种方式要比list再去取size好一些
QBC:分页
//开始位置 criteria.setFirstResult(0);
//每页记录数 criteria.setMaxResults(2);
//开始位置 criteria.setFirstResult(5); 第六条数据开始
//每页记录数 criteria.setMaxResults(10); 一次性读取十条
HQL用法
(1)hql语句写法: from 实体类名称 where 属性名称1=? and 属性名称2=?
用例一:条件查询
String hql = "from Customer c where c.cid=? and c.custName=?";
Query query = session.createQuery(hql);
//2 设置条件值 ?值
//?位置从0开始的
query.setParameter(0,1);//设置第一个?值
query.setParameter(1,"百度");//设置第二个?值
//3 调用query的方法得到结果
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
用例二:like
//1 创建query对象
String hql = "from Customer c where c.custName like ?";
Query query = session.createQuery(hql);
//2 设置?值
//模糊查询时候,需要值使用%设置匹配规则
query.setParameter(0,"%百%");
//3 调用方法得到结果
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
用例三:排序
String hql = "from Customer order by cid desc";
Query query = session.createQuery(hql);
//2 调用方法结果
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
用例四:分页
//1 创建query对象
Query query = session.createQuery("from Customer");
//2 设置分页数据
//2.1 设置开始位置
query.setFirstResult(0);
//2.2 设置每页记录数
query.setMaxResults(2);
//3 结果
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
用例五:投影
(1) select 属性名称1,属性名称2 from 实体类名称
(2)在hql语句中有select ,在select后面不能直接添加 *
一:
Query query = session.createQuery("select custName from Customer");
//2 结果
List<Object> list = query.list();
for (Object object : list) {
System.out.println(object);
}
二:
//1 创建query对象
Query query = session.createQuery("select cid,custName from Customer");
//2 结果
//返回list集合每部分是数组形式
List<Object[]> list = query.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
用例六:聚合函数
1 常用的聚集函数
count、sum、avg、max、min
2 查询表记录数hql语句
(1)select count(*) from 实体类名称
//1 创建query对象
Query query = session.createQuery("select count(*) from Customer");
//2 结果
//如果查询返回一个值
Object obj = query.uniqueResult();
//把object转换int类型
//变成long类型
Long lobj = (Long) obj;
//变成int
//long类型长整型号,不能直接强转成int类型
int count = lobj.intValue();
System.out.println(count);