hibernate查询数据方式,基础详解

Hibernate查询
1.对象查询语言HQL
1.1 HQL基础
Hibernate中最简单的检索查询可以通过发送对象id,调用get,load方法来实现,但是对于复杂条件下的对象检索,get/load就力不从心了.
针对这种状况,hiber提供了Query接口, 其实现对象可以解析符合Hiber对象查询语义的字符串HQL,并且提供了相关检索接口方法来实现复杂条件下的查询操作.
1.2 参数绑定
常用的有3种形式:
A. 以? 占位符号形式,通过Query对象对于当前参数下标(0开始)的setter方法传递参数值;
B. 以 :paramName 形式的命名参数查询,同样通过Query对象的setter方法来传递参数值;
C. 可以将参数封装在Map集合种以键值对存放,然后调用Query对象的setProperties方法来接收并解析为对应的命名参数,setProperties还可以接收一个javaBean,但是命名参数需要和javaBean的对应setXxx方法一致.
1.3 Query接口的使用
A. 通过Session接口的createQuery方法创建一个Query对象,该对象可以解析一个HQL查询字符串语句,这个HQL字符串可以包含多个命名参数.
B. 通过Query接口的setXXX方法动态绑定参数.例如 query.setString(0,”leon”);
C. 执行Query接口的list方法执行查询检索,该方法返回一个java.util.List实例,里面封装了当次检索的结果对象列表
1.4 HQL的检索方式
1.4.1 简单查询
Session s1 = HiberUtil.getSession();
Query query = s1.createQuery("from CustomerInfo c ");
List<CustomerInfo> custList1 = query.list();
System.out.println("[HQL当前客户的数量是:]"+custList1.size());
s1.close();
1.4.2 条件查询
根据命名参数的不同,可以有不同的动态绑定形式:
Session s1 = HiberUtil.getSession();
System.out.println("[HQL QUERY!]");
String hql="from CustomerInfo c where c.cName=? and c.cAge>:custAge";
Query query= s1.createQuery(hql);
// 为hql设置第一个参数(0号占位符),第二个参数的值以命名参数形式传递
query.setString(0, "leon");
query.setInteger("custAge", 21);
List<CustomerInfo> custList = query.list();
System.out.println(custList.get(0));
s1.close();
1.4.3 属性查询
也称为投影查询,针对部分具体对象属性的检索,注意list的结果是一个对象数组
Query query= s1.createQuery("select c.cAge,c.cName from CustomerInfo c ");
List<Object[]> ojbList = query.list();
for (Object[] objs : ojbList) {
System.out.println("\n第一个Ojbect数组的成员: ");
for (Object ojb : objs) {
System.out.print(" "+ojb);
}
}
1.4.4 实例化查询
这种查询很特殊,hiber可以通过目标对象指定的构造方法来接收并映射返回值;
Query query = s1.createQuery("select new CustomerInfo(cName,cAge) from CustomerInfo c ");
List<CustomerInfo> custList1 = query.list();
1.4.5 模糊查询
语法和sql类似, like关键字 + %xxx

Query query = s1.createQuery("from CustomerInfo c where c.cName like 'l%' ");
List<CustomerInfo> custList1 = query.list();
1.4.6 连接查询
Hql也可以执行内连接,左右外连接查询,需要留意的是结果,hiber不会将连接得到的结果集自动封装为对象图,而以对象数组形式存放.
Query query = s1.createQuery(" from CustomerInfo c inner join c.orderSet where c.cName=:cname").setString("cname", "leon");
List objs = query.list();
如果需要自动映射,那么可以通过hql的抓取策略实现:
" from CustomerInfo c left join fetch c.orderSet where c.cName=:cname"
1.4.7 统计函数查询
常用函数:
* count : 统计对象记录条数.
* max : 最大值
* min : 最小值
* sum : 求和
* avg : 求平均值
和SQL一样默认对全表做统计,如果需要分组,就配合使用group by 吧


1.4.8 分组统计查询
Group by 对象.对象属性
1.5 hql中外连接与预先抓取的区别
外连接得到的结果列表中保存的是连接双方的对象数组,
而预先抓取将连接双方自动映射为完整的对象图数据返回.
1.6 hibernate中的分页
超简单,Query接口提供两个方法,从哪里开始,每页查几条,ok, list吧
1.8 hibernate调用存储过程
根据存储过程的类别:
1. 如果是DML的结果,直接基于本地SQL查询调用就好.
2. 如果是DQL并返回结果集的,由于oracle使用动态游标封装结果集,因此必须通过session取出connection对象,直接基于JDBC的Callst接口方法执行,注意注册Oracle类型的输出游标.
3. 使用本地SQL查询
使用HQL或者QBC时,hibernate都会根据当前的数据库方言生成标准SQL,因此具备良好的跨数据库特性,但是某些时候,应用程序往往要直接执行高效的底层SQL来提升特殊业务的查询性能,这时就可以使用Hiber提供的本地SQL检索方案.
本地SQL基于SQLQuery的方法实现,SQLQuery接口是Query接口的子类接口,封装了相关本地SQL查询的方法.
4. 使用QBC(Criteria)查询
QBC检索查询方式提供了基于对象语义检索,主要由Criteria接口(封装了语义操作的相关操作方法),Criterion接口(封装符合规范的筛选条件对象),以及Restrictions类(条件限定类)协调工作执行查询.


使用QBC的3部曲:

1. 调用 createCriteria(),根据指定的类型创建一个Criteria语义查询对象.
2. 通过Restrictions类的静态方法设定查询条件,并返回筛选条件对象Criterion,每个Criterion对象代表一个查询筛选条件.
3. 调用Criteria的list方法执行查询,hiber生成sql通过jdbc向数据库发送指令.


3.1 条件查询


方法 描述
Restrictions.eq 对应SQL的“field=value”表达式
如:Restrictions.eq(“name”,”zx”);
Restrictions.allEq 方法的参数为一个Map类型对象,包含多个名/值对对应关系,相当于多个Restrictions.eq的叠加
Restrictions.gt 对应SQL的“field>value”表达式
Restrictions.ge 对应SQL的“field>=value”表达式
Restrictions.lt 对应SQL的“field<value”表达式
Restrictions.le 对应SQL的“field<=value”表达式
Restrictions.between 对应SQL语句的between表达式,如:查询年龄在21与27岁之间的用户,可以写成Restrictions.between(“age”,new Integer(21),new Integer(27));
Restrictions.like 对应SQL语句的”field like value”表达式
Restrictions.in 对应SQL语句的“field in(……)”表达式
Restrictions.eqProperty 用于比较两个属性值,对应”field=field”SQL表达式
Restrictions.gtProperty 用于比较两个属性值,对应”field>field”SQL表达式
Restrictions.geProperty 用于比较两个属性值,对应”field>=field”SQL表达式
Restrictions.ltProperty 用于比较两个属性值,对应”field<field”SQL表达式
Restrictions.leProperty 用于比较两个属性值,对应”field<=field”SQL表达式
Restrictions.and 对应SQL语句的And关系组合,如:Restrictions
.and(Restrictions
.eq(“name”,”zx”), Restrictions
.eq(“sex”,”1”));
Restrictions.or 对应SQL语句的Or关系组合,如:Restrictions.or(Restrictions
.eq(“name”,”zx”), Restrictions.eq(“name”,”zhaoxin”));
Restrictions.sql 作为补充这个方法提供了原生SQL语句查询的支持,在执行时直接通过原生SQL语句进行限定,如:Restrictions.sql(“lower({alias}.name) like (?)”,“zhao%”,Hibernate.STRING) ;在运行时{ alias }将会由当前查询所关联的实体类名替换,()中的?将会由”zhao%”替换,并且类型由Hibernate.STRING指定。

3.2 排序
Criteria.addOrder(Order.asc(属性名称)) 升序排;
Criteria.addOrder(Order.desc(属性名称)) 降序排;
3.3 连接查询
3.3.1 内连接查询
对应的hql : from CustomerInfo c inner join c.orderSet where c.cName=:cName;

QBC:
Session.createCriteria(CustomerInfo.class).add(Restrictions.eq(“cName”,”leon”))
.createAlias(“orderSet”,”order”)
.list();
其中, orderSet是CustomerInfo中关联集合属性
3.3.2 外连接预先抓取查询
session.createCriteria(CustomerInfo.class)
.setFetchMode(“orderSet”,FetchMode.JOIN)
.add(Restrictions.like(“cName”,”l”,MatchMode.START))
// 等同于 add(Restrictions.like(“cName”,”l%”))
.list();
等同于hql:
From CustomerInfo c left join fetch c.orderSet where c.cName like ‘l%’;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值