HQL查询
HQL查询:简单属性查询:
1.单一属性查询,返回属性结果集列表,元素类型和实体类中相应的属性类型一致。
2.多个属性查询,多个属性查询返回的是对象数组,对象数组的长度取决于属性的个数,对象数组中元素的类型取决于属性在实体类中属性的类型。 (我们可以使用增强for循环结合数组下标来获得属性具体信息)
3.如果觉得返回数组不够对象化,那么我们可以在实体中构造我们需要的构造方法,来获得我们需要的实体对象。
HQL查询:对象实体查询:
N + 1问题,就是发出了N+1条sql语句
1:首先发出查询对象id列表的语句
N:根据id到缓存中查询,如果缓存中不存在与之匹配的数据,那么会根据id发出相应的sql语句
list和iterate的区别?
list: 默认情况下list每次都会发出sql语句,list会将数据放到缓存中,而不利用缓存
iterate:默认情况下iterate利用缓存,如果缓存中不存在会出现N+1问题
备注:Hibernate4.x之后好像已经避免了N+1问题了吧。
HQL条件查询:
1.可以采用拼字符串的方式传递参数(不推荐使用,就有点类似jdbc中的Statement)
2.可以采用? 填充占位符的形式来添加参数(推荐使用,就类似jdbc中的PreapredStatement)
3.可以使用参数名来传递参数(类似于占位符但是要符合一定格式比如 name=:myname) 不是特殊情况就不要使用这种方式,也没看到有什么好处。
4.如果传递多个参数,可以采用setParamterList方法:就当是一个小技巧吧,没有它也能做。
5.在hql中可以使用数据库函数 如:date_format
备注:填充占位符的时候:索引下标是从0开始的,jdbc是从1开始的。
方法链式编程推荐使用
如果知道返回结果肯定是唯一的话,我们就不需要使用list()方法了,我们直接使用uniqueResult()方法
HQL查询:直接使用原生SQL查询
hibernate直接使用sql语句查询
备注:它只是把HQL转换为SQL其它的所有都没有变化。该怎么用就怎么用.
备注:如果遇到Hibernate性能瓶颈或是使用Hibernate的HQL实现太复杂的话,我们就需要考虑使用原生SQL了。
HQL查询: 外置命名查询
1.咋映射文件中使用<query>标签定义hql (完全不推荐,除非是有什么特殊要求)
2.在程序中使用session.getNamedQuery()方法得到hql查询串。
HQL查询: 查询过滤器
1.在映射文件中定义过滤参数
2.在类的映射中使用过滤参数
3.在程序中必须显示的启用过来长期,并且为过滤器参数赋值
HQL查询: 分页查询
1.setFirstResult(),从哪开始
2.setMaxResults(),每页显示的记录数
分页查询很重要,一定要很掌握。
HQL查询:对象导航查询
有时候它使用起来比SQL更方便。
HQL查询:连接查询
1.内连接 (即左右两边都有数据) 记录是最少的
2.外连接 (分为左外连接、右外连接)
按道理来说,外联结应该还有一个全连接的,但是我并没有在hibernate出发现,不过在Oracle中全外连接记录是最多的。
HQL查询:统计查询
统计查询(挺重要的)
备注:分组函数
HQL查询:DML风格的操作(尽量少用,因为和缓存不同步)
参考我自己写的程序hibernate4.x项目
导出建表语句的方法:
Configuration cfg = new Configuration().configure();
SchemaExport export = new SchemaExport(cfg);
export.create(true, true);