Hibernate支持的查询方式
HQL查询 : |
Criteria查询 : |
原生SQL(Native SQL)查询 : |
HQL(Hibernate Query Language)是Hibernate查询语言
把表替换为持久化类
把列替换为持久化类的属性
select * 的时候可以省略,直接写from 对象名
from cn.hibernatdemo.entity.Dept
from Dept
from Dept where deptName = 'SALES'
from Dept dept where dept.location is not null
from Emp order by hireDate, salary desc (默认升序,desc降序)
select deptNo, deptName from Dept
1、执行HQL语句的步骤
①、获取Session对象
②、编写HQL语句
③、创建Query对象
④、执行查询,得到查询结果
A、list()方法
session = sessionFactory.getCurrentSession();
String hql = "from Emp";
Query query = session.createQuery( hql );
List<Emp> empList = query.list();
B、iterate()方法
session = sessionFactory.getCurrentSession();
String hql = "from Emp";
Query query = session.createQuery( hql );
Iterator<Emp> empIterator = query.iterate();
iterator会查询二级缓存,list只会查询一级缓存
2、HQL参数绑定的两种形式
使用占位符,防止sql注入:
a、按参数位置绑定
from User where name = ? 下标从0开始
b、按参数名称绑定
from User where name = :name 可读性好,易维护,推荐使用
使用字符串拼接查询条件存在各种弊端”from User where name = ‘” + name + “’”
性能低 不安全
为参数赋值
setXXX():针对具体数据类型
setXXX( int position, XXX value)
setXXX( String name, XXX value)
setParameter():任意类型参数
setParameter( int position, Object value)
setParameter( String name, Object value)
setProperties():专为命名参数定制
@Test
public void showListByProperties(){
Session session = HibernateUtil.getCurrentSession();
String hql = "from Users where name = :name and password = :pwd";
Query q = session.createQuery(hql);
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "赵云1");
map.put("pwd", "33333");
// 定制参数 map key 一定要跟参数名一致
q.setProperties(map);
Users u = (Users) q.uniqueResult();
System.out.println(u.getName() + " " + u.getId() + " " + u.getPassword());
}
HQL实现动态查询:比如某宝条件筛选
@Test
public void queryParamBean(){
ParamBean bean = new ParamBean();
bean.setId(1010);
bean.setName("赵云1");
bean.setPwd("33333");
Map<String, Object> map = new HashMap<String, Object>();
// 动态查询
Session session = HibernateUtil.getCurrentSession();
StringBuffer hql = new StringBuffer("from Users where 1 = 1"); // 给一个true条件,不然直接拼接and,sql语法错误
if(bean.getId() != null){
hql.append(" and id = :id");
map.put("id", bean.getId());
}
if(bean.getName() != null){
hql.append(" and name = :name");
map.put("name", bean.getName());
}
if(bean.getPwd() != null){
hql.append(" and password = :pwd");
map.put("pwd", bean.getPwd());
}
Query q = session.createQuery(hql.toString());
q.setProperties(map);
List<Users> list = q.list();
for (Users u : list) {
System.out.println(u.getName() + " " + u.getId() + " " + u.getPassword());
}
}
HQL分页查询
Query接口的相关方法
uniqueResult() :获取唯一对象
setFirstResult() :设置从第几条开始
setMaxResults():设置读取最大记录数
HQL投影查询
投影查询概念: 查询一个持久化类的一个或多个属性值,或者是通过表达式或聚合函数得到的值
投影查询条件: 投影查询需要使用HQL的select子句
查询结果的封装主要分三种情况:
a、封装成Object对象
b、封装成Object数组
c、通过构造方法封装成对象,对象不是持久化状态,仅用于封装结果
若查询结果仅用于展示,不需要保持持久化状态,应尽量使用投影查询以减少开销,提高效率
使用MyEclipse添加Hibernate支持和反向工程生成映射关:http://blog.csdn.net/tmaskboy/article/details/51755588
HQL与SQL语句的主要区别是什么?
HQL是Hibernate查询语言(Hibernate Query Language)
hql是面向对象查询,格式:from + 类名 + 类对象 + where + 对象的属性
sql是面向数据库表查询,格式:from + 表名 + where + 表中字段
Hibernate中如何实现分页查询?
uniqueResult() :获取唯一对象
setFirstResult() :设置从第几条开始
setMaxResults():设置读取最大记录数
常用的主键生成器类型有哪些?
1.Assigned 主键由数据库内部生成,无需Hibernate干预。
2.hilo 需要额外数据库表保存主键生成历史状态。
3.increment 在实例中维持一个变量,以保存当前最大值。多实例访问时可能会出错。
4.identity 采用数据库提供的生成机制,如SQL Server、MySQL中自增主键生成机制。
5.sequence 采用数据库提供的sequence生成机制,如果Oracle。
6.uuid.hex 由hibernate基于128位唯一值算法生成,最大的保证唯一性,可能数万年才出现一次重复。
7.native 由hibernate自动判断数据库类型而采用不同的生成机制,常用。
什么是刷新缓存?何时刷新缓存?
刷缓存时,Hiberante会对Session中持久状态的对象进行检测,判断对象的数据是否发生了改变,
刷新缓存就是将数据库同步为与Session缓存一致,刷新缓存时会执行脏检查,
Session会在以下时间点刷新缓存:调用Session的flush()方法、调用Transaction的commit()方法