【Hibernate】【Session对象】【Query对象和HQL】

本文详细介绍了Hibernate框架中Session对象的应用,包括Session的获取与关闭、基本操作如增删改查等,并深入探讨了HQL查询及Query对象的使用技巧。
部署运行你感兴趣的模型镜像

Session对象

1.简介

  • session对象是与数据库会话的对象,提供了与数据库交互的方法.
  • session对象是线程不安全的,所以不能做为全局变量.

2,Session对象的获取和关闭

获取/创建和关闭的方法:

        //获取新的session对象(不常用)
        Session session = sessionFactory.openSession(); 
        //获取当前的session对象(常用)
        Session session = sessionFactory.getCurrentSession();
        //关闭session(不常用)
        session.close();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

创建和关闭的位置: 
- 为了防止延迟加载导致没实例化对象的问题(报错 no session),应该在请求时候创建session,响应时,关闭session. 
- pring框架提供了这个监听器 ContextLoaderListener 
在web.xml中

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3.Session方法

1.增删改(o表示一个对象)
        //删除对象
        session.delete(o);
        //保存对象
        session.save(o);//返回对象的id值.立刻执行,不需要事务
        //更新对象;必须在事务之内
        session.update(o);
        //有id就更新,没id保存
        session.saveOrUpdate(o);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
        //JPA的标准,为保存,要在事务内
        session.persist(o);
        //更新
        session.merge(o);
  • 1
  • 2
  • 3
  • 4
2.查

查单个对象

    session.get(对象.getClass,id);  //立刻执行
    session.load(对象.getClass,id);  //延迟加载(返回代理对象,永不为null;使用非主键属性时候才会实例化)
  • 1
  • 2

查多个对象

  • 使用hql方式
        //Employee代表类
        String hql="select e from Employee e";
        //生成查询对象
        Query query = session.createQuery(hql);
        //进行查询
        List<Employee> list = query.list();//直接返回封装好的对象
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 使用sql方式
        //Employee代表表名
        String sql="select * from Employee e";
        //生成查询对象
        Query query = session.createSQLQuery(sql);
        //进行查询
        List<Object[]> list = query.list(); //Object[],自己要重新封装成对象
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 使用criteria方式(无需hql和sql语句)
        //生成查询对象
        Criteria criteria = session.createCriteria(Employee.class);
        //进行查询
        List<Employee> list = criteria.list();
  • 1
  • 2
  • 3
  • 4
  • 使用NamedQuery方式
//在映射文件中声明hql语句,在`<class>`之后,于`<class>`同级
<query name="SELECT_ALL_EMPLOYEE">
    select e from Employee
</query>
  • 1
  • 2
  • 3
  • 4
        session.getNamedQuery("SELECT_ALL_EMPLOYEE").list();
  • 1

Query对象和HQL

Query对象

Query对象可以预先对查询结果进行处理,Criteria对象也一样

        query.list();  //获取查询结果
        query.uniqueResult(); //获取唯一的结果
        query.setFirstResult(0).setMaxResults(10);//从第一个开始,选十个对象;
        query.setParamter("0","1L");//设置参数
  • 1
  • 2
  • 3
  • 4
Query结合HQL的使用
  • 查询总数.

    //HQL=select count(e) from Employee e;
    int count =query.uniqueResult();
  • 1
  • 2
  • 3
  • 设置参数

//方式1,用索引
    //HQL= select e from Employee e where e.name like ?;
    List<Employee> list = query.setParameter(0,"%Armo%").list();

//方式2,用名称占位符
    //hql=select e from Employee e where e.name like :name;
    query.setParameter("name","%Armo%").list();
    //hql=select e from Employee e where e.id in (:ids);
    query.setParameter("ids",new Long[]{1L,2L,3L}).list();
    //hql=select e from Employee e where e.dept =:dept;
    query.setParameter("dept",部门对象).list();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 结果集的处理
//用list<Object>接收

    //HQL=select (e.name) from Employee e
    List<String> list=query.list();
    //HQL=select new List(e.name,e.id,e.dept) from Employee e;
    List<List<Object>> list=query.list();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
//用List<Map<Stirng,Object>>来接收

    //HQL=select new Map(e.name as name,e.id as id,e.dept as dept) from Employee e;
    list<Map<Stirng,Object>> = query.list
  • 1
  • 2
  • 3
  • 4
//用list<实例对象>来接收
    //HQL=select new Employee2 (e.id,e.name,e.dept) from Employee1 e;
    List<Employee2> list=query.list();

Employee1 :映射文件对应的类
Employee2 :另外一个类,这儿可以用全限名,要么用别名.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
<!--设置别名在映射文件中-->
    <hibernate-mapping package="domain" auto-import="false">//取消自动生成别名
        <import class="类全限名" rename="别名"/>
    </hibernate-mapping>

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值