hibernate知识记录

  • 查询方式

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()方法进行查询并返回结果。

具体:

 

  • Restrictions、Order、Projections的常用方法

Restrictions类的常用方法(设置查询条件):

返回值类型方法名称描述
SimpleExpressionRestrictions.eq等于(equal)
CriterionRestrictions.allEq使用Map,Key/Valu进行多个等于的比对
SimpleExpressionRestrictions.gt大于(great than)
SimpleExpressionRestrictions.ge大于等于(great than or equal)
SimpleExpressionRestrictions.lt小于(less than)
SimpleExpressionRestrictions.le小于等于(less than or equal)
CriterionRestrictions.between对应SQL的between
SimpleExpressionRestrictions.like对应SQL的like
CriterionRestrictions.in对应SQL的in
LogicalExpressionRestrictions.andand关系
LogicalExpressionRestrictions.oror关系
CriterionRestrictions.isNull为空
CriterionRestrictions.sqlRestrictionSQL限定查询

 

Order类的常用方法(设置排序方式):

返回值类型方法名称描述
OrderOrder.asc升序
OrderOrder.desc降序

 

Projections类的常用方法(统计和分组):

返回值类型方法名称描述
AggregateProjectionProjections.avg求平均值
CountProjectionProjections.count统计某属性的数量
CountProjectionProjections.countDistinct统计某属性不同值的数量
PropertyProjectionProjections.groupProperty指定某个属性为分组属性
AggregateProjectionProjections.max求最大值
AggregateProjectionProjections.min求最小值
ProjectionListProjections.projectionList创建一个ProjectionList对象
ProjectionProjections.rowCount查询结果集中的记录条数
AggregateProjectionProjections.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);

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值