HQL是Hibernate Query Language的缩写,提供更加丰富灵活、更为强大的查询能力;HQL更接近SQL语句查询语法。

HQL基础查询 

1.获取部分列 多列

 /**
* 获取部分列 多列 Object[]
*/
@Test
public void testgetMultipelColumns(){
String hql="select d.dname,d.loc from Dept d";
Query query=session.createQuery(hql);
List<Object[]> list=query.list();
for (Object[] item:list){
for (Object items:item) {
System.out.println(items+"--");
}
System.out.println();
}
}

2.获取部分列 多列 list<强类型>

   /**
* 获取部分列 多列 list<强类型>
*/
@Test
public void testgetMultipelColumns(){
String hql="select new Dept(d.deptno,d.dname,d.loc) from Dept d";
Query query=session.createQuery(hql);
List<Dept> list=query.list();
for (Dept dept:list){
System.out.println(dept.getDname());
}
}

HQL参数查询 

使用字符串拼接查询条件存在各种弊端"from User where name = '" + name + "'"
性能低
不安全

使用占位符
按参数位置绑定
from User where name = ?
按参数名称绑定
from User where name = :name

   /**
* 参数查询: 方案三::dname 参数名称绑定+对象属性
*/
@Test
public void selectByConditionParameternameAndObjectAttribute(){
//部门名称为SALES的部门信息
String hql="from Dept d where d.dname=:dname and d.loc=:loc";
Query query = session.createQuery(hql);
DeptModel model=new DeptModel();
model.setDname("SALES");
model.setLoc("CHICAGO");
query.setProperties(model);
List<Dept> list = query.list();
for (Dept dept:list) {
System.out.println(dept.getDname());
}
}
/**
* 参数查询: 方案二::dname 参数名称绑定
*/
@Test
public void selectByConditionParametername(){
//部门名称为SALES的部门信息
String hql="from Dept d where d.dname=:dname and d.loc=:loc";
Query query = session.createQuery(hql);
query.setParameter("dname","SALES");
query.setParameter("loc","CHICAGO");
List<Dept> list = query.list();
for (Dept dept:list) {
System.out.println(dept.getDname());
}
}
/**
* 参数查询: 方案一:? 匿名占位符
*/
@Test
public void selectByConditionNiming(){
//部门名称为SALES的部门信息
String hql="from Dept d where d.dname=? and d.loc=?";
Query query = session.createQuery(hql);
query.setParameter(0,"SALES");
query.setParameter(1,"CHICAGO");
List<Dept> list = query.list();
for (Dept dept:list
) {
System.out.println(dept.getDname());
}
}

动态查询

   /**
* 动态sql
*/
@Test
public void selectByDynamic() throws ParseException {
EmpCondition emp=new EmpCondition();
emp.setJob("CLERK");
emp.setSal(1000.0);
//入职时间
emp.setFromDate(Tool.strDate("1891-05-01"));
//离职时间
emp.setEndDate(new Date());
//根据条件拼接sql
StringBuilder sb=new StringBuilder("from Emp e where 1=1 ");
if(emp.getJob()!=null){
sb.append("and e.job =:job ");
}
if(emp.getSal()!=null){
sb.append("and e.sal >:sal ");
}
if (emp.getFromDate()!=null){
sb.append("and e.hiredate >=:fromDate ");
}
if (emp.getEndDate()!=null){
sb.append("and e.hiredate <=:endDate ");
}
Query query=session.createQuery(sb.toString());
query.setProperties(emp);
List<Emp> list = query.list();
for (Emp item:list) {
System.out.println(item.getEname());
}
}

分页查询

Query接口的相关方法
uniqueResult()  :获取唯一对象
setFirstResult() :设置从第几条开始
setMaxResults():设置读取最大记录数

  /**
* 分页
*/
@Test
public void selectPage(){
String hql="from Emp order by empno";
Query query = session.createQuery(hql);
int pageIndex=1;
int pageSize=3;
query.setFirstResult((pageIndex-1)*pageSize);
query.setMaxResults(pageSize);
List<Emp> empList=query.list();
for (Emp emp:empList){
System.out.println(emp.getEname());
}
}

提取工具类:HibernateUtil.java

   //线程变量
static ThreadLocal<Session> tlSession=new ThreadLocal<Session>();
public static SessionFactory factory;
static Configuration cfg=null;
static {
cfg=new Configuration().configure("hibernate.cfgscott.xml");
factory=cfg.buildSessionFactory();
}
//1.获取连接
public static Session getSession(){
//01 从线程中尝试获取
Session session=tlSession.get();
if (session==null){
session=factory.openSession();
tlSession.set(session);
}
return session;
}
//2.释放连接
public static void closeSession(){
Session session=tlSession.get();
if (session!=null){
tlSession.set(null);
session.close();
}
}

HQL实用技术的更多相关文章

  1. 第五章 HQL实用技术

    第五章   HQL实用技术5.1  使用HQL查询语句(面向对象查询语句)    5.1.1 编写HQL语句        5.1.1.1 from子句                    例:fr ...

  2. Hibernate=====HQL实用技术

    Hibernate支持三种查询语言:HQL查询.Criteria查询和原生SQL查询 HQL(hibernate Query Language,hibernate查询语言)是一种面向对象查询语言,其中 ...

  3. Hibernate-02 HQL实用技术

    学习任务 Query接口的使用 HQL基本用法 动态参数绑定查询 HQL的使用 Hibernate支持三种查询方式:HQL查询.Criateria查询.Native SQL查询. HQL是Hibern ...

  4. 深入HQL学习以及HQL和SQL的区别

    HQL(Hibernate Query Language) 是面向对象的查询语言, 它和 SQL 查询语言有些相似. 在 Hibernate 提供的各种检索方式中, HQL 是使用最广的一种检索方式. ...

  5. hibernate -- HQL语句总结

    1. 查询整个映射对象所有字段 //直接from查询出来的是一个映射对象,即:查询整个映射对象所有字段 String hql = "from Users"; Query query ...

  6. Hibernate 查询方式(HQL/QBC/QBE)汇总

    作为老牌的 ORM 框架,Hibernate 在推动数据库持久化层所做出的贡献有目共睹. 它所提供的数据查询方式也越来越丰富,从 SQL 到自创的 HQL,再到面向对象的标准化查询. 虽然查询方式有点 ...

  7. hql中in关键字的用法

    hql: from " + FoodComment.class.getName() + " f where f.id in :groupIds" 封装的方法: publi ...

  8. [转]HQL中的子查询

    原文地址:http://blog.csdn.net/xb12369/article/details/8638683 子查询:   子查询是SQL语句中非常重要的功能特性,它可以在SQL语句中利用另外一 ...

  9. Hibernate--------八大类HQL查询集合

    Hibernate的   八大类HQL查询集合 Hibernate的八大类HQL查询集合: 一:属性查询(SimplePropertyQuery) 1,单一属性查询 *返回结果集属性列表,元素类型和实 ...

随机推荐

  1. 集腋成裘-06-angularJS -angular_02

    1.0 选项卡 其中涉及到了三目运算符号; <!DOCTYPE html> <html ng-app="test"> <head> <me ...

  2. IDEA的字体设置

    最后点击ok

  3. Android NDK笔记

    目录 Android NDK笔记 AOSP Android repository Android SDK / SDK Tools NDK cmake && ninja lldb adb ...

  4. vi不保存退出

    To quit the vi editor without saving any changes you've made If you are currently in insert or appen ...

  5. bzoj2683&&bzoj4066

    题解: 前一题不是强制在线,后一题是强制在线 树套树空间会炸 说一下cdq分治+树状数组 首先我们利用cdq分治使得查询和操作保证先后关系 然后矩阵查询变成4个矩阵的差 那么我们就可以运用扫描线的方法 ...

  6. MySQl 查询性能优化相关

    0. 1.参考 提升网站访问速度的 SQL 查询优化技巧 缓存一切数据,读取内存而不是硬盘IO 如果你的服务器默认情况下没有使用MySQL查询缓存,那么你应该开启缓存.开启缓存意味着MySQL 会把所 ...

  7. 原 HTML5 requestFullScreen&exitFullscreen全屏兼容方案

                         摘要: html5 video全屏实现方式 首先来说,这个标题具有误导性,但这样设置改标题也是主要因为video使用的比较多 在html5中,全屏方法可以适用 ...

  8. 【Android】GestureDetector类及其用法

    当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等. 一般情况下,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouc ...

  9. glusterfs分布式复制扩容卷以及平衡卷

    随着数据量的增长,需要扩容满足使用.今天测试下glusterfs磁盘扩容的具体步骤 1.扩容 之前用的2台计算机的分布式复制卷.需要同时之两个服务器增加一块磁盘并格式化,挂载并扩容 热添加磁盘 ech ...

  10. lvs-dr

    第5节  dr模型 在rs上配置 :rip  和vip   vip定义在lo别名上 Director 上配置:vip  和dip 都只需要一块网卡  网卡都桥接 Vip: 192.168.0.105 ...