`

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(
010)
                                           .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(
15)
           .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);

分享到:
评论

相关推荐

    hibernate -HQL

    hql基础语句和输出方式

    Hibernate HQL基础练习小列子+数据库文件

    Hibernate HQL基础练习小列子+数据库

    Hibernate数据检索(HQL)笔记

    魔乐科技,李兴华老师的Hibernate教程笔记,对Hibernate的基础知识进行了比较详细的讲解,对初学者有一个比较笼统的介绍,是带我们入门Hibernate的不二选择。

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

    第5章 对象-关系映射基础  5.1 持久化类的属性及访问方法  5.1.1 基本类型属性和包装类型属性  5.1.2 Hibernate访问持久化类属性的策略  5.1.3 在持久化类的访问方法中加入程序逻辑  5.1.4 设置派生属性  ...

    Hibernate HQL基础 限定查询条件 .doc

    基本上包含了HQL常用的所有类型的语句了

    Hibernate基础配置导入的最小JAR包

    hibernate3.jar-核心类库 antlr-2.7.6.jar-代码扫描器,用来翻译HQL语句 commons-collections-3.1.jar-功能比java.util.*强大 dom4j-1.6.1.jar-类似于jdom,用来读写XML文件的 javassist-3.4.GA.jar- Javassist 字节...

    深入浅出Hibernate中文版 part1

    4.1 Hibernate基础语义 4.2 基础配置 4.3 Hibernate O/R映射 4.4 数据关联 4.5 Hibernate数据检索 4.6 HQL实用技术 4.7 自定义持久化实现 第5章 Hibernate高级特性 5.1 Hibernate持久化实现 5.2 Hibernate...

    hibernate笔记

    4 hibernate基础配置(重点) 5 5 ID生成策略(重点 AUTO) 5 6 Hibernate核心开发接口介绍(重点) 5 7 对象的三种状态(了解) 5 8 关系映射(重点) 5 9 Hibernate査询(HQL) 5 10 在Struts基础上继续完善BBS200 5...

    Hibernate HQL教程

    hibernate HQL详细教程,简单易学易懂 1.1 HQL基础 2 1.1.1 默认数据库表和数据 2 1.1.2 检索类的所有对象 4 1.1.3 检索类的某几个属性 5 1.1.4 指定别名 5 1.1.5 where条件子句 5 1.1.6 使用distinct过滤掉重复值 6...

    hibernate基础

    主要内容包括Hibernate的基本体系结构、如何使用Java5注解和基于XML的映射文件来表示映射信息,并讨论了HibernateSession对象和HQL的使用。本书结合大量实际代码,力图使读者能够更好地学习并掌握Hibernate的使用。...

    Hibernate_HQL

    Hibernate基础知识,已实例的方式展现了hibernate的精髓,让我们从云里雾里的概念中脱离出来,从实战所需的角度来分析hibernate。

    hibernate基础 注解开发 检索

    hibernate的注解开发 注解开发关联映射 HQL、QBC、本地SQL检索数据

    Hibernate 3.6.0.Final Reference PDF 手册

    第 16 章 HQL: Hibernate 查询语言 第 17 章 条件查询(Criteria Queries) 第 18 章 Native SQL 查询 第 19 章 过滤数据 第 20 章 XML 映射 第 21 章 提升性能 第 22 章 工具箱指南 第 23 ...

    深入浅出Hibernate中文版 part2

    第4章 Hibernate基础 4.1 Hibernate基础语义 4.2 基础配置 4.3 Hibernate O/R映射 4.4 数据关联 4.5 Hibernate数据检索 4.6 HQL实用技术 4.7 自定义持久化实现 第5章 Hibernate高级特性 5.1 Hibernate持久...

    hql语句查询

    一些基础的hql语写法

    深入浅出Hibernate(PDF)第一部分

    本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术...

    深入浅出Hibernate.pdf

    本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术...

    深入浅出Hibernate

    本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了 Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用...

    深入浅出Hibernate(PDF)第二部分

    本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术...

    深入浅出hibernate(PDF)第三部分

    本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术...

Global site tag (gtag.js) - Google Analytics