Hibernate第二章

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()方法

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值