- 浏览: 161689 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
jiangyeqt:
好好的温习了一遍,讲的非常的到位
Session的原理 -
JAVA静静:
这是什么啊?有没有源码?看不懂诶!
开源框架Pushlet入门 -
colinzhy:
讲的很深刻,学习了
Session的原理 -
昔雪似花:
...
Map-iterator -
不相信眼泪:
恩,很好,多谢
.scc文件是做什么用的?
在hql中关键字不区分大小写,但是属性和类名区分大不写
简单属性查询[重要]
1 单一属性查询,返回结果集属性列表,元素类型和实体类中相应的属性类型一致
数组元素的类型和对应的属性在实体类中的类型一致
数组的长度取决于select中属性的个数
注意,必须有在实体类中有相应的构造方法
setEntity();
实体对象查询[重要]
1 忽略select,返回Student对象的集合,可以忽略select
在默认情况下,使用query.iterate查询,有可能出现N+1问题
所谓N+1是在查询的时候发出N+1条sql语句
* 1:先发出查询id的sql
* N:再依次发出根据id查询Student对象的sql
在默认情况下list每次都会向数据库发出查询对象的sql,除非配置查询缓存,
但list默认情况下不会利用缓存,而是每次发出sql
在默认情况下,list会向缓存中放入数据,但不会利用数据
* list:在默认情况下每次都会向数据库发出sql,list会向缓存中放入数据,但不会利用缓存中的数据
* iterate:在默认情况下会利用缓存中的数据,但缓存中不存在数据,有可能出现N+1问题
条件查询[重要]
* 方法链编程
可以采用拼字符串的方式组织查询条件
可以采用?占位符来传递参数,参数的索引从0开始,传递的参数值不用单引号引起来
可以采用“:参数名称”的方式传递参数,效果等同于?占位符方式
支持in,使用“(:参数名称)”的方式传递数组,用setParameterList()设置数组参数
不建议使用
原生sql查询
外置命名查询
* 在映射文件中采用<query>标签来定义hql,可以在任何一个映射文件中,name属性名能重复
查询过滤器
* 在映射文件中定义过滤器参数
分页查询[重要]
对象导航查询,在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 多个属性查询,返回的集合元素是对象数组for(Iterator iter=students.iterator();iter.hasNext();){
String name=(String)iter.next();
System.out.println(name);
}
数组元素的类型和对应的属性在实体类中的类型一致
数组的长度取决于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对象集合for(Iterator iter=students.iterator();iter.hasNext();){
Object[] obj=(Object[])iter.next();
System.out.println(obj[0]+":"+obj[1]);
}
注意,必须有在实体类中有相应的构造方法
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命名别名
for(Iterator iter=students.iterator();iter.hasNext();){
Student stu=(Student)iter.next();
System.out.println(stu.getId()+":"+stu.getName());
}
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 实体属性for(Iterator iter=students.iterator();iter.hasNext();){
Object[] obj=(Object[])iter.next();
System.out.println(obj[0]+":"+obj[1]);
}
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
for(Iterator iter=students.iterator();iter.hasNext();){
Student stu=(Student)iter.next();
System.out.println(stu.getName()+":"+stu.getCreateTime());
}
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("from Student as s").list();
for(.){.}
List students=session.createQuery("select s from Student as s").list();
for(.){.}
4 不支持select * from...这样的查询
for(.){.}
[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对象的集合while(iter.hasNext()){
Student stu=(Student)iter.next();
System.out.println(stu.getName()+":"+stu.getCreateTime());
}
在默认情况下list每次都会向数据库发出查询对象的sql,除非配置查询缓存,
但list默认情况下不会利用缓存,而是每次发出sql
在默认情况下,list会向缓存中放入数据,但不会利用数据
List students=session.createQuery("from Student").list();
for(.){.}
7 list和iterate的区别for(.){.}
* 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 拼字符串query.setParameter(0, "%1%");
List students =query.list();
//等效于:
List students=session.createQuery("select id,name from Student where name like ?")
.setParameter(0, "%1%")
.list();
可以采用拼字符串的方式组织查询条件
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 “:参数名” 传递参数.setParameter(0, "%1%")
.list();
可以采用“:参数名称”的方式传递参数,效果等同于?占位符方式
List students=session.createQuery("select id,name from Student where name like :myname")
.setParameter("myname", "%1%")
.list();
4 支持in,采用(:参数名)传递参数数组.setParameter("myname", "%1%")
.list();
支持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
.setParameterList("myids", new Object[]{1,2,3,4,5,6})
.list();
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中可以使用数据库中的函数 .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();
不建议使用
List students=session.createQuery("select id,name from Student where date_format(createTime,'%Y-%m')=?")
.setParameter(0, "2008-02")
.list();
.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]);
}
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查询串
<![CDATA[
select s from Student s where s.id<?
]]>
</query>
List students=session.getNamedQuery("searchStudents")
.setParameter(0, 10)
.list();
.setParameter(0, 10)
.list();
查询过滤器
* 在映射文件中定义过滤器参数
<filter-def name="filtertest">
<filter-param name="myid" type="integer"/>
</filter-def>
* 在类的映射中使用这些参数
<filter-param name="myid" type="integer"/>
</filter-def>
<class name="com.my.hibernate.Student">
<filter name="filtertest" condition="id < :myid"/>
</class>
* 在程序中起用过滤器,传入参数<filter name="filtertest" condition="id < :myid"/>
</class>
session.enableFilter("filtertest").setParameter("myid", 10);
List students=session.createQuery("from Student").list();
List students=session.createQuery("from Student").list();
分页查询[重要]
List students=session.createQuery("from Student")
.setFirstResult(0)
.setMaxResults(3)
.list();
//setFirstResult()从0开始
//setMaxResults()每页显示多少条数据
.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();
// 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 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();
// 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();
.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);
发表评论
-
Java通用数据访问层Fastser-DAL推荐
2014-12-29 10:20 5614本着不重复造轮子的原则,基于mybatis、spring ... -
hibernate基础-初步
2009-11-03 15:26 709类拟框架:Apache OJB,JDO,Toplink,EJB ... -
hibernate基础-基本映谢标签和属性
2009-11-03 15:35 779hibernate基本映射 实体类------>表 实体 ... -
hibernate基础-映射关系(多对一I一对一)
2009-11-03 15:53 712多对一关联映射 many-to-one关联映射本质: * ... -
hibernate基础-映射关系(一对多I多对多).
2009-11-03 16:04 660一对多关联映射(one-to-many) 一对多关联映射利用了 ... -
hiberante基础-继承映射
2009-11-03 16:15 622继承映射的三种策略: * 单表继承,每棵类继承树使用一个表 ... -
hibernate基础-其他映射
2009-11-03 16:17 649set、list、array、map Collection: ... -
hibernate基础-自关联映射
2009-11-03 16:19 6511 class Node: private int id;pr ... -
hibernate基础-Component+[联合]映象
2009-11-03 16:22 602Component映射(值对象映射) 在hibernate中, ... -
hibernate基础-lazy策略
2009-11-03 16:33 586lazy策略可以使用在: * <class> ... -
hibernate基础-fetch抓取
2009-11-03 16:34 695抓取策略(单端代理的批量抓取) 1 保持默认,也就是fetch ... -
hibernate基础-Session_Flush
2009-11-03 16:37 830session flush测试: session ... -
hibernate基础-悲观[乐观]锁
2009-11-03 16:40 685悲观锁 悲观锁的实现,通常依赖于数据库机制,在整个过程中将数据 ... -
hiberante基出-缓存
2009-11-03 16:49 745一级缓存 * 一级缓存是缓存实体对象的 * 如果管理一 ... -
hibernate基础-HibernateTemplate
2009-11-03 17:20 7531 ,void delete ( Object entity ... -
[导入]Hibernate 深入研究之 Criteria
2009-11-03 17:35 674文章来源:http://www.cnblogs.com/ ... -
DetachedCriteria
2009-11-03 17:41 945org.hibernate.criterion.Detache ... -
Restrictions
2009-11-03 17:46 839HQL运算符 ... -
hibernate.cfg.xml
2009-11-03 17:56 652<?xml version="1.0&quo ... -
由映射文件生成表
2009-11-03 17:57 717import org.hibernate.cfg.Confi ...
相关推荐
- "HQL查询语言.doc"可能包含HQL的基础语法和用法的介绍。 - "HQL查询.doc"可能深入探讨了更复杂的查询技巧和注意事项。 - "HQL语句(结合实例).doc"则可能提供了具体的查询示例,帮助读者更好地理解和应用HQL。...
本篇文档将深入探讨Hibernate中的HQL(Hibernate Query Language),一种面向对象的查询语言,它提供了与SQL类似的语法,但更贴近于面向对象的思维模式,使得开发者可以更加便捷地进行数据查询。 一、HQL简介 HQL是...
2. **HQL/SQL编辑器**:提供语法高亮和智能提示,支持HQL(Hibernate Query Language)和SQL的编写与调试。 3. **数据库连接管理**:方便地创建、编辑和测试数据库连接,支持多种数据库类型。 4. **逆向工程**:...
【标题】"hibernate-hql-testing-1.0.0.Alpha5.zip" 提供的是Hibernate框架的一个测试工具包,专注于HQL(Hibernate Query Language)的测试。Hibernate是Java领域中广泛使用的对象关系映射(ORM)框架,它允许...
1. **find(String queryString)**: 这是最基础的HQL查询方法,接受一个HQL语句作为参数,返回所有匹配该查询的实体对象。例如,"from bean.User"会返回所有的User对象。 2. **find(String queryString, Object ...
- **HQL与Criteria API增强**:HQL(Hibernate Query Language)和Criteria API 在此版本中得到了显著增强,提供了更多的查询选项和灵活性。 - **EclipseLink集成**:虽然主要还是一个Hibernate版本,但该版本也考虑...
3. **hibernate-jpa-2.1-api**: 提供JPA 2.1的API接口,是Hibernate与JPA交互的基础。 4. **hibernate-validator**: Hibernate的验证框架,符合JSR-303/JSR-349标准,用于数据验证,确保输入数据的正确性。 5. **...
Hibernate Core是Hibernate框架的基础部分,它包含了ORM的核心功能,如实体管理、事务处理、查询语言(HQL)等。`5.0.11.Final`版本是一个稳定且广泛使用的版本,提供了诸多改进和优化。 二、源码结构解析 `...
此外,Hibernate Tools的可视化HQL和SQL编辑器也是其亮点。开发者可以通过直观的界面编写查询语句,实时查看结果,甚至进行调试。在新版本中,编辑器的性能得到提升,支持更多的语法高亮和智能提示,使开发者在编写...
7. **查询语言HQL和 Criteria API**: Hibernate提供了自己的查询语言HQL(Hibernate Query Language),类似于SQL,但面向对象。Criteria API则提供了一种类型安全的、基于对象的查询方式。 8. **性能优化**: ...
学习Hibernate,首先要掌握Java基础和基本的SQL知识,然后深入理解Hibernate的配置文件,如hibernate.cfg.xml,学会配置数据库连接、实体类映射等。接着,通过实践操作,了解Session、Transaction的使用,以及Query...
Hibernate 是一个著名的开源对象关系映射(ORM)框架...综上所述,"hibernate3-2 官方jar包+api"是学习和开发基于Hibernate 3.2的Java应用的基础资源,涵盖了ORM的核心概念和技术,帮助开发者更高效地管理数据库操作。
2. 数据库操作:使用Session的save()、update()、delete()方法进行CRUD操作,或者使用Criteria、HQL等查询语言进行复杂查询。 3. 关联映射:通过@ManyToOne、@OneToMany等注解定义实体之间的关联关系,实现对象的懒...
- Criteria查询增强:允许更复杂的动态查询构建,超越了HQL(Hibernate查询语言)的限制。 - Cache管理:提供更细粒度的缓存控制,包括第二级缓存和查询缓存的优化。 - Batch处理:支持批量插入、更新和删除操作...
- HQL(Hibernate Query Language):类似于SQL,专门用于查询Hibernate实体的语句。 - QBC(Query By Criteria):基于Java对象的查询方式,提供构建查询条件的API。 通过以上讲解,我们可以看出`hibernate-...
除了上述主要功能外,HibernateTools还包含了一些实用小工具,如HQL查询编辑器、数据库浏览器等。这些工具使得开发者可以直接在工具内调试HQL语句,查看数据库表结构,从而提高开发效率。 总结起来,HibernateTools...
`hibernate-core` jar包是使用Hibernate的基础,它包含了所有必要的类和接口,使得开发者能够集成ORM功能到Java应用中。通过理解和熟练使用Hibernate-Core,可以极大地提高数据库操作的效率和代码的可维护性。
3. **查询语言HQL**:Hibernate Query Language(HQL)是一种面向对象的查询语言,类似于SQL,但更接近Java的语法,可以更方便地进行对象查询。 4. **Criteria查询**:提供了一种基于对象的查询方式,允许开发者...
在Hibernate 4.2.4版本中,其核心库包含了一系列关键的jar包,这些jar包构成了Hibernate功能的基础。下面我们将逐一剖析这些jar包的作用,以帮助读者深入理解Hibernate的核心机制。 首先,`hibernate-core-4.2.4....