HQL实用技术

HQL实用技术

Hibernate支持的查询方式

  • HQL查询

  • Criteria查询

  • 原生SQL(Native SQL)查询

什么是HQL

HQL是Hibernate查询语言(Hibernate Query Language)

from cn.hibernatedemo.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
    
select deptNo,deptName from Dept

执行HQL语句

执行HQL语句的步骤

  • 获取Session对象
  • 编写HQL语句
  • 创建Query对象
  • 执行查询,得到查询结果
session = sessionFactory.getCurrentSession();
String hql = "from Emp";
Query query = session.createQuery(hql);
//list()方法
List<Emp> empList = query.list();
session = sessionFactory.getCurrentSession();
String hql = "from Emp";
Query query = session.createQuery(hql);
//iterate()方法
Iterator<Emp> empIterator = query.itertate();

在HQL查询语句中绑定参数

  • 使用字符串拼接查询条件存在各种弊端
    "from User where name = ’ " + name + " ’ "

    • 性能低
    • 不安全
  • 使用占位符

    • 按参数位置绑定
      • from User where name = ?
      • 下标从 0 开始
    • 按参数名称绑定
      • from User where name = :name
      • 可读性好,易维护,推荐使用

为参数赋值

  • setXXX():针对具体数据类型
    • setXXX( int position, XXX value)
    • setXXX( String name, XXX value)
  • setParameter():任意类型参数
    • setParameter( int position, Object valeu)
    • setParameter( String name, Object value)
  • setProperties():转为命名参数定制

动态HQL查询

Map<String,Object> map = new HashMap<>();
map.put("job","CLERK");
map.put("sal",1000);
map.put("startDate","1981-4-1");
map.put("endDate","1984-9-9");

public List<Emp> queryEmps(Map map){
    String hql = "from Emp where 1=1";
    StringBulider sb = new StringBulider(hql);
    
    String job = map.get("job");
    Integer sal = map.get("sal");
    Date startDate = map.get("startDate");
    Date endDate = map.get("endDate");
    
    if(null != jog){sb.append("and job = :job");}
    if(sal > 0){sb.append("and sal > :sal");}
    if(null != startDate && null != endDate){
        sb.append("and hireDate >= :startDate and hireDate <= :endDate");
    }
    
    hql = sb.toString();
    Query query = session.createQuery(hql);
    
    if(null != jog){query.setParameter("job",job);}
    if(sal > 0){query.setParameter("sal",sal);}
    if(null != startDate && null != endDate){
        query.setParameter("startDate",startDate);
        query.setParameter("endDate",endDate);
    }
    
    return query.list();
}

分页查询

  • Query接口的相关方法

    • uniqueResult():获取唯一对象

    • setFirstResult():设置从第几条开始

    • setMaxResults():设置读取最大记录数

      String hql = "from User";
      List<User> users = session.createQuery(hql).setFirstResult(5).setMaxResults(5).list();

投影

  • HQL投影查询是查询一个持久化类的一个或多个属性值,或者是通过表达式或聚合函数得到的值
  • 投影查询需要使用HQL的select子句
  • 查询结果的封装主要分三种情况
    • 封装成Object对象
    • 封装成Object数组
    • 通过构造方法封装成对象
      • 对象不是持久化状态,仅用于封装结果

若查询结果仅用于展示,不需要保持持久化状态,应尽量使用投影查询以减少开销,提高效率

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值