hibernate 学习之——hql 语句

hibernatre hql 语句:是对于hibernate的orm模式的一种类似于JDBC语句的面对对象的操作语句

特点 :

1.对于类名属性名区分大小写
2.不能进行新增的操作 可以对增删改进行操作
3.使用 hibernate query 对象进行操作

基本语法

—–[select|update|delete]——–
select关键词后跟的是需要返回的对象或者对象属性,且属性必须属于from子句中给出的类列表。使用select可以直接存入一个List对象或直接封装为一个对象。
使用示例:
1、查询具体属性
select stu.cores.english from Student as stu;
上述语句查询出学生的英语成绩
2、查询并放入List对象
select new List(stu.id,stu.name) from Student as stu;
查询了学生的学号和名字,放入一个List中
3、查询并生成对象
select new Student(stu.id,stu.name) from Student as stu;
查询了学生的学号和名字,并生成一个Student对象。使用前提:Student类中存在相应的构造方法。
4、查询所有属性 代码示例

Session session = HibernateSessionFactory.getSession();String hql = "from Dep";Query query = session.createQuery(hql);List<Dep> deps = query.list();for (Dep dep : deps) {System.out.println(dep.getDepid() + "\t" + dep.getDepname());}

分页操作

Query query = session.createQuery(hql);//分页query.setFirstResult(3).setMaxResults(5);

语句解释:设置一个query对象 从下标3开始查询 查询5条数据

list() 与 iterate() 区别

https://blog.csdn.net/xiaokang123456kao/article/details/61916647
原博文地址

Query的两个方法,list()和 iterate() , 两个方法都是把结果集列出来, 他们有3点不一样,
1:返回的类型不一样,list()返回List,iterate()返回Iterator,
2: 获取数据的方式不一样,list()会直接查数据库,iterate()会先到数据库中把id都取出来,然后真正要遍历某个对象的时候先到缓存中找,如果找不到,以id为条件再发一条sql到数据库,这样如果缓存中没有数据,则查询数据库的次数为n+1。

3:iterate会查询2级缓存, list只会查询一级缓存。
4: list()中返回的List中每个对象都是原本的对象,iterate()中返回的对象是代理对象.(debug可以发现)

5: session中list第二次发出,仍会到数据库査询
6: iterate 第二次,首先找session 级缓存

list()方法在执行时,直接运行查询结果所需要的查询语句。
iterator()方法则是先执行得到对象ID的查询,然后在根据每个ID值去取得所要查询的对象。
因此:对于list()方式的查询通常只会执行一个SQL语句,而对于iterator()方法的查询则可能需要执行N+1条SQL语句(N为结果集中的记录数).
结果集的处理方法不同:
list()方法会一次取出所有的结果集对象,而且他会依据查询的结果初始化所有的结果集对象。如果在结果集非常庞大的时候会占据非常多的内存,甚至会造成内存溢出的情况发生。
iterator()方法在执行时不会一次初始化所有的对象,而是根据对结果集的访问情况来初始化对象。一次在访问中可以控制缓存中对象的数量,以避免占用过多的缓存,导致内存溢出情况的发生。

投影查询 和 对象查询

我们知道Hibernate框架是ORM(持久层)类型框架,所以有很多数据库优化方式,比如缓存等等,当我们只有查询出某个对象中的1,2个属性时,如果使用HQL的方式的查询,你将会是查询该对象的全部属性!这就代表着,你将会降低查询速度(浪费系统资源),Hibernate框架为此也给出了解决方案:”投影查询”

假设:映射实体对象为 Emp
具备属性:empid empanme

第一种解决方案:

Session session = HibernateSessionFactory.getSession();//投影   返回的是一个数组String hql = "select empid , empname  from Emp ";Query query = session.createQuery(hql);//如果查询的只有一个字段  就是返回一个字段    查询多个字段才会保存在数组中List<Object[]> list =(List<Object[]> )query.list();for (Object[] objects : list) {System.out.println(objects[0]+"\t"+objects[1]);}```

我们可以发现投影查询返回的是一个List

Session session = HibernateSessionFactory.getSession();//投影   返回的是一个数组String hql = "select new Emp(empid , empname ) from Emp ";Query query = session.createQuery(hql);//如果查询的只有一个字段  就是返回一个字段    查询多个字段才会保存在数组中List<Emp> list =query.list();for (Emp emp : list) {System.out.println(emp.getEmpname()+"\t"+emp.getEmpid());}}型限定的User),这种方式解决了传递Object[]方式,只传递对象了,且也实现了,只查询部分属性,需要注意的是User 映射对象 中必须
要有对应查询语句的构造参数(还要补上一个无参数构造方法,不然在进行merge,saveOrUpdate等方法操作时会报错(复制副本的时候没有无参构造函数))

public Emp(Integer empid, String empname) {
this.empid = empid;
this.empname = empname;
}

使用内置函数条件查询

查询所有大于depid的dep对象 //对于内置函数对大小写没有要求

Session session = HibernateSessionFactory.getSession();// 投影 返回的是一个数组String hql = "from Dep where depid > (select avg(depid) from Dep)";Query query = session.createQuery(hql);// 如果查询的只有一个字段 就是返回一个字段 查询多个字段才会保存在数组中List<Dep> list = query.list();for (Dep dep : list) {System.out.println(dep.getDepid()+"\t"+dep.getDepname());}
结果:
4   为
5   卫生部

hql join 语句使用实践

错误实例:

Session session = HibernateSessionFactory.getSession();// 投影 返回的是一个数组String hql = "from Emp e join e.dep ";Query query = session.createQuery(hql);// 如果查询的只有一个字段 就是返回一个字段 查询多个字段才会保存在数组中List<Emp> list = query.list();session.close();for (Emp emp : list) {System.out.println(emp.getEmpid() + "\t" + emp.getEmpname() + "\t");}结果报错 : 无法映射到dep

正确实例 :

Session session = HibernateSessionFactory.getSession();// 投影 返回的是一个数组String hql = "from Emp e join e.dep ";Query query = session.createQuery(hql);// 如果查询的只有一个字段 就是返回一个字段 查询多个字段才会保存在数组中List<Object[]> list = query.list();session.close();for (Object[] objects : list) {System.out.println(((Emp) objects[0]).getEmpname() + "\t"+ ((Dep) objects[1]).getDepname());}

反思 通过联合查询 查到的实际是两个对象 然后强转对象得到对应数值
解决办法 :join fetch

Session session = HibernateSessionFactory.getSession();// 投影 返回的是一个数组String hql = "from Emp e join fetch e.dep ";Query query = session.createQuery(hql);// 如果查询的只有一个字段 就是返回一个字段 查询多个字段才会保存在数组中List<Emp> list = query.list();session.close();for (Emp emp : list) {System.out.println(emp.getEmpname()+"\t" + emp.getDep().getDepname());}

一个”fetch”连接允许仅仅使用一个选择语句就将相关联的对象或一组值的集合随着他们的父对象的初始化而被初始化,这种方法在使用到集合的情况下尤其有用,对于关联和集合来说,它有效的代替了映射文件中的外联接 与延迟声明(lazy declarations).

hql 查询内置函数结果实例

查询depid的平均值

Session session = HibernateSessionFactory.getSession();// 投影 返回的是一个数组String hql = "select avg(depid) from Dep";Query query = session.createQuery(hql);/*List<Integer> list = query.list();System.out.println(list.get(0));*/Double l = (Double) query.uniqueResult();System.out.println(l);

tips : 查询结果使用 query.uniqueResult();

hql 实战 删除语法

Session session = HibernateSessionFactory.getSession();Transaction transaction = session.beginTransaction();// 投影 返回的是一个数组String hql = "delete from Emp where empid = ? ";Query query = session.createQuery(hql);query.setParameter(0, 5);int n = query.executeUpdate();System.out.println(n);transaction.commit();

tips :
1.需要开启事务
2.query.setParameter(0, 5); 下标从0开始 赋值 与sql 从1开始不同

还有很多骚操作 还得慢慢学习
体会 : hql 的学习 需要理解 hibernate的orm 面对对象的操作 今天学习了 mybatis 之后出一个 mybatis 系列 方便对比理解

hibernate 学习之——hql 语句相关推荐

  1. hibernate中的hql语句,字符串时间范围筛选处理

    一.疑难问题 1.数据表的业务时间是字符串类型. 2.如何通过hql语句进行业务时间范围筛选. 二.解决方法 1.将业务时间字符串类型转换成时间类型. mysql中字符串转时间:str_to_date ...

  2. 应用hibernate中的hql语句对日期的操作总结

    ------------------------------------------------------------------------这篇文章是我在进行hibernate查询时由于百度搜索很 ...

  3. Hibernate——HQL语句

    HQL(Hibernate Query Language) – 官方推荐 前面的入门示例中,我们通过session.load(Employee.class, 1),也就是通过load()方法或者get ...

  4. hibernate中的hql查询语句list查询所有与iterate查询所有的区别

    hibernate中的hql查询语句list查询所有与iterate查询所有的区别 list查询所有: 01,会立即产生一条select语句1select查询出来的所有语句都会被session管理, ...

  5. HQL语句中数据类型转换,及hibernate中createQuery执行hql报错

    一.HQL语句中数据类型转换: 我们需要从数据库中取出序号最大的记录,想到的方法就是使用order by子句进行排序(desc倒序),然后取出第一个对象,可是当初设计数据库时(我们是在原来的数据库的基 ...

  6. hibernate -- HQL语句总结

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

  7. Hibernate 学习笔记(二)—— Hibernate HQL查询和 QBC 查询

    目录 一.Hibernate 的 HQL 查询 1.1.查询所有数据 1.2.条件查询 1.3.排序查询 1.4.统计查询 1.5.分页查询 1.6.投影查询 二.Hibernate 的 QBC 查询 ...

  8. Hibernate 持久化状态、HQL语句大全(转)

    Hibernate 持久化状态 在Hibernate中,最核心的概念就是对PO的状态管理.一个PO有三种状态: 1.未被持久化的VO 此时就是一个内存对象VO,由JVM管理生命周期 2.已被持久化的P ...

  9. Hibernate写hql语句与不写hql语句的区别?

    写hql语句与不写hql语句的区别? 写hql语句:书写HQL语句,所有的查询与投影的设计均使用HQL语句完成. 不写hql语句:没有任何查询语句,所有的查询与投影的设计使用面向对象格式完成. 二者选 ...

最新文章

  1. 自定义 coding.net 静态网站域名
  2. 略谈新时尚风之网上购物领域
  3. LTRIM、RTRIM和TRIM在ORACLE中的用法:
  4. 【算法知识】详解选择排序算法
  5. android闹钟——原代码【转】
  6. VMware Fusion8下CentOS7.1 安装vmtools报错kernel header path
  7. linux内核相关知识
  8. 腾讯图片处理 Tencent AlloyTeam 2013
  9. hadoop java配置环境变量_hadoop2.7.2修改配置文件,配置linux java环境变量
  10. 基于Adaboost的音乐情绪分类算法
  11. 计算机网络class 3(速率的相关性能指标)
  12. Turtle库是Python语言中一个很流行的绘制图像的函数库
  13. duilib介绍-1
  14. JavaScript实现开关灯效果
  15. 谷歌身份验证器插件以及基于utools的otp快捷使用
  16. 【百练】护林员盖房子
  17. mongoDb内嵌文档的数据查询
  18. eas bos客户端获取组织,人员,用户的方法
  19. 2021-01-30关于IE浏览器被篡改主页无法修改的解决办法
  20. 【Delphi学习】Form的borderstyle属性

热门文章

  1. soot 简介 | 安装运行
  2. DOTween的使用
  3. java8(三)Stream API
  4. 前端人脸识别解决方案
  5. jQuery面试题答案
  6. linux postfix 虚拟,postfix虚拟别名域的配置
  7. LINUX 报错:使用scp复制文件No such file or directory 及主机名注意事项
  8. 软件测试学习笔记与思考(1)---软件测试基础
  9. 第三方登录---微信登录
  10. javascript Xpath学习笔记-----document.evaluat();