Hibernate支持的查询方式
HQL查询
Criteria查询
原生SQL(Native SQL)查询
HQL是一种面向对象的查询语言,其中没有和字段的概念,只有类,对象和属性的概念。
执行HQL语句的步骤
1.获取Session对象
2.编写HQL语句
3.创建Query对象
4.执行查询,得到查询结果
执行HQL语句
返回list集合
String hql = "from Emp";
Query query = session.createQuery( hql );
List<Emp> empList = query.list();
iterate()方法:
返回iterate迭代器
String hql = "from Emp";
Query query = session.createQuery( hql );
Iterator<Emp> empIterator = query.iterate();
uniqueResult()方法:
返回唯一一条结果
String hql = "select count(id) from Emp";
Query query = session.createQuery( hql );
Long count=(Long) query.uniqueResult()
在HQL查询语句中绑定参数
使用字符串拼接查询条件存在各种弊端
“from User where name = '” + name + “’”
性能低
不安全
使用占位符
1.按参数位置绑定
//下标从0开始
from User where name = ?
2.按参数名称绑定
//可读性好,易维护,推荐使用
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():
专为命名参数定制
实现动态查询
注意:命名参数名一定要和参数封装对象的属性名一致
分页查
Query接口的相关方法
uniqueResult() :获取唯一对象
setFirstResult() :设置从第几条开始
setMaxResults():设置读取最大记录数
public List<House> getByPage(int pageNo,int pageSize){
return HibernateUtil.getSession().createQuery("from House order by id")
.setFirstResult((pageNo-1)*pageSize)//设置获取结果的起始下标
.setMaxResults(pageSize)//最大返回结果值
.list();
}
投影
1.HQL投影查询是查询一个持久化类的一个或多个属性值,或者是通过表达式或聚合函数得到的值
2.投影查询需要使用HQL的select子句
3.查询结果的封装主要分三种情况
封装成Object对象
封装成Object数组
通过构造方法封装成对象
对象不是持久化状态,仅用于封装结果
经验:若查询结果仅用于展示,不需要保持持久化状态,应尽量使用投影查询以减少开销,提高效率