hibernate基础-HQL

在hql中关键字不区分大小写,但是属性和类名区分大不写

简单属性查询[重要]
1  单一属性查询,返回结果集属性列表,元素类型和实体类中相应的属性类型一致
 List students = session.createQuery( " select name from Student " ).list();
            
for (Iterator iter = students.iterator();iter.hasNext();) {
                String name
=(String)iter.next();
                System.out.println(name);
          }
2  多个属性查询,返回的集合元素是对象数组
  数组元素的类型和对应的属性在实体类中的类型一致
  数组的长度取决于select中属性的个数

 List students = session.createQuery( " select id, name from Student " ).list();
            
for (Iterator iter = students.iterator();iter.hasNext();) {
                Object[] obj
=(Object[])iter.next();
                System.out.println(obj[
0]+":"+obj[1]);
            }
3  对象化查询,可以采用hql动态实例化Student对象,此时list中为Student对象集合
   注意,必须有在实体类中有相应的构造方法
List students = session.createQuery( " select new Student(id, name) from Student " ).list();
            
for (Iterator iter = students.iterator();iter.hasNext();) {
                Student stu
=(Student)iter.next();
                System.out.println(stu.getId()
+":"+stu.getName());
            }
4  别名查询,可以使用as命名别名
 List students = session.createQuery( " select s.id, s.name from Student as s " ).list();
            
for (Iterator iter = students.iterator();iter.hasNext();) {
                Object[] obj
=(Object[])iter.next();
                System.out.println(obj[
0]+":"+obj[1]);
            }
5 实体属性
  setEntity();



实体对象查询[重要]


1 忽略select,返回Student对象的集合,可以忽略select
List students = session.createQuery( " from Student " ).list();
            
for (Iterator iter = students.iterator();iter.hasNext();) {
                Student stu
=(Student)iter.next();
                System.out.println(stu.getName()
+":"+stu.getCreateTime());
            }
2 使用别名,返回Student对象的集合,可以使用别名,两种方式都支持:空格或as
List students = session.createQuery( " from Student s " ).list();
  List students
= session.createQuery( " from Student as s " ).list();
  
for (.) {.}
3 使用select,返回Student对象的集合,使用select用,必须使用别名
List students = session.createQuery( " select s from Student as s " ).list();
  
for (.) {.}
4 不支持select * from...这样的查询
[X]List students = session.createQuery( " select * from Student s " ).list(); // 错误的[X]
5 使用query.iterate查询
  在默认情况下,使用query.iterate查询,有可能出现N+1问题
  所谓N+1是在查询的时候发出N+1条sql语句
  * 1:先发出查询id的sql
 * N:再依次发出根据id查询Student对象的sql
Iterator iter = session.createQuery( " from Student " ).iterate();
            
while (iter.hasNext()) {
                Student stu
=(Student)iter.next();
                System.out.println(stu.getName()
+":"+stu.getCreateTime());
            }
6 使用query.list查询,返回Student对象的集合
  在默认情况下list每次都会向数据库发出查询对象的sql,除非配置查询缓存,
  但list默认情况下不会利用缓存,而是每次发出sql
 在默认情况下,list会向缓存中放入数据,但不会利用数据
List students = session.createQuery( " from Student " ).list();
    
for (.) {.}
7 list和iterate的区别
  * list:在默认情况下每次都会向数据库发出sql,list会向缓存中放入数据,但不会利用缓存中的数据
  * iterate:在默认情况下会利用缓存中的数据,但缓存中不存在数据,有可能出现N+1问题


条件查询[重要]

* 方法链编程
 Query query = session.createQuery( " select id,name from Student where name like ? " );
            query.setParameter(
0 " %1% " );
            List students 
= query.list();
    
// 等效于:
        List students = session.createQuery( " select id,name from Student where name like ? " )
                                       .setParameter(
0 " %1% " )
                                       .list();
1 拼字符串
  可以采用拼字符串的方式组织查询条件
List students = session.createQuery( " select id,name from Student where name like '%1%' " ).list();
2 ?传递参数
  可以采用?占位符来传递参数,参数的索引从0开始,传递的参数值不用单引号引起来
  List students = session.createQuery( " select id,name from Student where name like ? " )
                                   .setParameter(
0 " %1% " )
                                   .list();
3 “:参数名” 传递参数
  可以采用“:参数名称”的方式传递参数,效果等同于?占位符方式
  List students = session.createQuery( " select id,name from Student where name like :myname " )
                                   .setParameter(
" myname " " %1% " )
                                   .list();
4 支持in,采用(:参数名)传递参数数组
  支持in,使用“(:参数名称)”的方式传递数组,用setParameterList()设置数组参数
  List students = session.createQuery( " select id,name from Student where id in (:myids) " )
                                   .setParameterList(
" myids " new  Object[] {1,2,3,4,5,6} )
                                   .list();
5 支持and和between
  List students = session.createQuery( " select id,name from Student where name like :myname and id=:myid " )
                                   .setParameter(
" myname " " %1% " )
                                   .setParameter(
" myid " 12 )
                                   .list();
    SimpleDateFormat sdf
= new  SimpleDateFormat( " yyyy-MM-dd HH:mm:ss " );
    List students
= session.createQuery( " select id,name from Student where createTime between ? and ? " )
                                   .setParameter(
0 , sdf.parse( " 2008-01-10 00:00:00 " ))
                                   .setParameter(
1 , sdf.parse( " 2008-02-15 00:00:00 " ))
                                   .list();
6 在hql中可以使用数据库中的函数 
 不建议使用
  List students = session.createQuery( " select id,name from Student where date_format(createTime,'%Y-%m')=? " )
                                   .setParameter(
0 " 2008-02 " )
                                   .list();

原生sql查询

List students = session.createSQLQuery( " select * from t_student).list();
   for (Iterator iter = students.iterator();iter.hasNext();) {
                Object[] obj
=(Object[])iter.next();
                System.out.println(obj[
0]+":"+obj[1]);
            }

外置命名查询

  * 在映射文件中采用<query>标签来定义hql,可以在任何一个映射文件中,name属性名能重复
< query  name ="searchStudents" >
            
<![CDATA[
                 select s from Student s where s.id<?
            
]]>
        
</ query >
  * 在程序中采用session.getNameQuery()方法得到hql查询串
 List students = session.getNamedQuery( " searchStudents " )
                                           .setParameter(
0 10 )
                                           .list();

查询过滤器

  * 在映射文件中定义过滤器参数
     < filter-def  name ="filtertest" >
    
< filter-param  name ="myid"  type ="integer" />
   
</ filter-def >
  * 在类的映射中使用这些参数
     < class  name ="com.my.hibernate.Student" >
    
< filter  name ="filtertest"  condition ="id &lt; :myid" />
  
</ class >
  * 在程序中起用过滤器,传入参数
    session.enableFilter( " filtertest " ).setParameter( " myid " 10 );
   List students
= session.createQuery( " from Student " ).list();

分页查询[重要]

List students = session.createQuery( " from Student " )
                                       .setFirstResult(
0 )
                                       .setMaxResults(
3 )
                                       .list();
// setFirstResult()从0开始
// setMaxResults()每页显示多少条数据

对象导航查询,在hql中采用“.”进行导航[重要]

List students = session.createQuery( " select  s.name from Student s where s.classes.name like '%1%' " ).list();

连接查询[重要]

  * 内连接
    List students = session.createQuery( " select c.name,s.name from Student s join s.classes c " )
                                 .list();
      
//  inner可以省略
        List students = session.createQuery( " select c.name,s.name from Student s inner join s.classes c " )
                                 .list();
  * 外连接(左连接/右连接)
// 左:
List students = session.createQuery( " select c.name,s.name from Classes c left join c.students s " ).list();
// 右:
List students = session.createQuery( " select c.name,s.name from Classes c right join c.students s " ).list();

统计查询[重要]

List stu = (List)session.createQuery( " select count(*) from Student " ).list();
//  uniqueResult()查询单一值,返回Long类型
Long count = (Long)session.createQuery( " select count(*) from Student " ).uniqueResult();
//  分组查询问
List students = (List)session.createQuery( " select c.name,count(s) from Student s join s.classes c group by c.name order by c.name " ).list();


DML风格的查询

批量修改、删除、插入,可能会出现脏数据,尽量少用,和缓存不同步

session.createQuery( " update Student s set s.name=? where s.id<? " )
           .setParameter(
0 " 田田田 " )
           .setParameter(
1 5 )
           .executeUpdate();


其他


is null, and, or, not, in, between
Restrictions.like("bookname","a",MatchMode.START);
关键字不区分大小写,类名区分大小写,类名不能用关键字,类名可以用全名

select s from Student s where s.name like '%李%'
select s from Student s where s.name like ?
query.setString(0,"%李%").list();
query.setEntity(classes);//对象实体参数
注意jdbc中perstmt参数从1开始
from Student s where s.id between :dd and :dr
query.setInt(dd,1);
query.setInt(dr,2);
select j from Tjd j,Tfw f where f.jd=j and fw.lxr='王先生'
select s from Strudent s,Classes c where s.classes=c //联表查询
分页
query.setFirstResult(0);//默认从0开始
query.setMaxResult(int size);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值