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. Allegro PCB Design GXL (legacy) 使用slide推挤走线,走线的宽度就发生改变的原因

    Allegro PCB Design GXL (legacy) version 16.6-2015 使用slide推挤走线,走线的宽度就会发生改变. 后来发现是因为约束管理器(Constraint M ...

  2. spring cloud 路由网关zuul的高可用

    Zuul的高可用非常关键,因为外部请求到后端微服务的流量都会经过Zuul.故而在生产环境中,我们一般都需要部署高可用的Zuul以避免单点故障. 笔者分两种场景讨论Zuul的高可用. Zuul客户端也注 ...

  3. js 浮点数相加 变成字符串 解决方案

    var count = 0; count+=Number(parseFloat(value[i]['sla']).toFixed(2)); 数字相加的时候最好使用Number转换一下

  4. CSS3D写3d画廊滚动

    CSS样式表 *{ margin: 0; padding: 0; } .wrapper{ width: 800px; height: 600px; background: #87CEEB; margi ...

  5. 20165206 2017-2018-2 《Java程序设计》第五周学习总结

    20165206 2017-2018-2 <Java程序设计>第五周学习总结 教材学习内容总结 内部类:支持在一个类中定义另一个类的类. 外嵌类:包含内部类的类,称为内部类的外嵌类. 匿名 ...

  6. python基础知识之zip

    names =['zhangning','lsl','lyq','xww']age = [1,2,3,4]for a,b in zip(names,age): print(a,b)S = 'abcde ...

  7. 微信公众号之:JSSDK接入以及invalid signature等常见错误问题

    最近在搞微信公众号开发,进行到网页开发部分被坑了一天,最坑的问题就是invalid signature,而网上大部分解答这个问题的都没有说清楚,都直接丢文档.博主认为这样很不好.本文是博主结合自身遇到 ...

  8. python--使用队列结构来模拟共享打印机等候时间

    按书里的样例抄的. 可以看到,将打印速度由第分钟5页提高到10页之后, 每个学生提交打印任务到打印完成的时间明显缩短. =========================== 在计算机科学实验室里考虑 ...

  9. 網管利器!開源管理系統-LibreNMS

    https://www.4rbj4.com/442 https://www.ichiayi.com/wiki/tech/librenms

  10. javascript var变量删除

    var有三种声明的情形: var声明的全局变量 var在函数范围内声明的局部变量 eval中声明的全局变量. 首先, 1.2种情形var声明的变量是无法删除的. 尽管var声明的全局变量是属于wind ...