HQL语句

概述

HQL是Hibernate Query Language的缩写,提供更加丰富灵活、更为强大的查询能力;HQL更接近SQL语句查询语法。

用法

使用经典的的数据库表关系模型学生选课:student(学生表)、course(课表)、sc(成绩表)

1) FROM子句的使用

from子句的查询可以使用全限定名进行查询,也可以使用别名进行查询。

/**  * @Title: testFrom  * @Description: from子句的使用* @throws  */  @Testpublic void testFrom() {// 使用全限定名查询
//        String hql = "from demo.hql.domain.Student";// 查询主体必须和持久化类保持一致
//        String hql = "from Student";// 使用别名,方便hql语句的其他部分通过别名引用该类
//        String hql = "from Student as s";// 使用别名可以不使用as关键字String hql = "from Student s";Query query = session.createQuery(hql);List<Student> students = query.list();for (Student student : students) {System.out.println(student);}}

2) 限定FROM子句的返回值

以Object[]形式返回选择的属性

/**  * @Title: testSelectObjectArray  * @Description: 以Object[]形式返回选择的属性* @throws  */  @Testpublic void testSelectObjectArray() {String hql = "select s.sname,s.ssex from Student s";Query query = session.createQuery(hql);List<Object[]> list = query.list();for (Object[] objects : list) {System.out.println("name:" + objects[0] + "age:" + objects[1]);}// 如果返回的结果只有一个的话,就不能用Object[]来接收,否则会报错/*String hql = "select s.sname from Student s";Query query = session.createQuery(hql);List<Object> list = query.list();for (Object object : list) {System.out.println("name:" + object);}*/}

以List形式返回选择的属性

/**  * @Title: testSelectList  * @Description: 以List形式返回选择的属性* @throws  */  @Testpublic void testSelectList() {String hql = "select new list(s.sname,s.ssex,s.sage) from Student s";Query query = session.createQuery(hql);List<List> lists = query.list();for (List list : lists) {System.out.println("name:" + list.get(0) + " sex:" + list.get(1) + " age:" + list.get(2));}}

以map的形式返回结果

/**  * @Title: testSelectMap  * @Description: 以map的形式返回结果* @throws  */  @Testpublic void testSelectMap() {String hql = "select new map(s.sname,s.ssex,s.sage) from Student s";Query query = session.createQuery(hql);List<Map> maps = query.list();// 返回结果的   key 就是查询的顺序 value 就是返回的结果for (Map map : maps) {System.out.println("name:" + map.get("0") + " sex:" + map.get("1") + " age:" + map.get("2"));}}

以自定义类型返回结果

/**  * @Title: testSelectCustomType  * @Description: 以自定义类型返回结果* @throws  */  @Testpublic void testSelectCustomType() {// 自定义类中必须有相应的构造方法String hql = "select new Student(s.sname,s.ssex,s.sclass) from Student s";Query query = session.createQuery(hql);List<Student> students = query.list();for (Student student : students) {System.out.println("name:" + student.getSname() + " sex:" + student.getSsex() + " class:" + student.getSclass());}}

distinct关键字去除重复元素

 /**  * @Title: testSelectDistinct  * @Description: 使用distinct关键字去除重复元素* @throws  */  @Testpublic void testSelectDistinct() {String hql = "select distinct s.sclass from Student s";Query query = session.createQuery(hql);List<Object> objects = query.list();for (Object object : objects) {System.out.println(object);}}

3) WHERE子句

where子句中有比较运算、范围运算、字符串匹配运算、逻辑运算、集合运算、四则运算
/**  * @Title: testWhere  * @Description: where子句* @throws  */  @Testpublic void testWhere() {/** 比较运算* 运算符  =  <>  <  >  >=  <=* null 值判断    is null/is not null*///        String hql = "from Student s where s.sage > 20";
//        String hql = "from Student s where s.sclass <> null";/** 范围运算* in / not in (候选值列表)* between / not between  值1 and 值2*///        String hql = "from Student s where s.sage in (20,25)";
//        String hql = "from Student s where s.sage not between 20 and 25";/** 字符串模式匹配* like关键字* 通配符  %:匹配任意个字符  _:匹配一个字符*///        String hql = "from Student s where s.sname like '_二'";
//        String hql = "from Student s where s.sname like '_二%'";/** 逻辑运算* and   or    not*///        String hql = "from Student s where s.sname like '_二' or s.sage = 20";/** 集合运算* is empty / is not empty  集合为空/不为空      empty ——> exists* member of  元素属于集合     member of ——>  in*///        String hql = "from Student s where s.scs is empty";/** 四则运算*   +  -  *  /*/String hql = "from Student s where s.sage + 2 > 21";Query query = session.createQuery(hql);List<Student> students = query.list();for (Student student : students) {System.out.println(student);}}

4)ORDER BY 对查询结果进行排序

/**  * @Title: testOrderBy  * @Description: order by 子句对查询结果进行排序* @throws  */  @Testpublic void testOrderBy() {
//        String hql = "from Student s order by s.sage";String hql = "from Student s order by s.sage asc , s.sid desc";Query query = session.createQuery(hql);List<Student> students = query.list();for (Student student : students) {System.out.println(student);}}

5) uniqueResult方法查询单个对象

 /**  * @Title: testUniqueResult  * @Description: uniqueResult方法查询单个对象,如果有多个结果会报错* @throws  */  @Testpublic void testUniqueResult() {String hql = "from Student s where s.sid = 1";Query query = session.createQuery(hql);Student student = (Student) query.uniqueResult();System.out.println(student);}

菜鸟先飞之HQL语句的运用相关推荐

  1. 菜鸟要飞java_Java Android视频教程 下载

    安卓 |____14_Android源码级分析(day69)(更多视频教程关注微信公众号[菜鸟要飞]) |____Android源码级分析.7z |____13_百度地图(day68)(更多视频教程关 ...

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

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

  3. 常用SQL语句和HQL语句写法

    1.左(右)外连接: select b.phone_no,a.pak_no from t_phone a left(right) join t_pak_used b on (a.phone_no=b. ...

  4. hibernate -- HQL语句总结

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

  5. HQL语句使用row_number() over(partition by),分组排序取topN

    在 mysql中实现over partiton by,进行分组排序取topN https://georgedage.blog.csdn.net/article/details/103557651 使用 ...

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

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

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

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

  8. SSH:hql语句传参报错,及antlr-2.7.2.jar重复包的删除

    问题: 使用hql语句时出现 java.lang.reflect.InvocationTargetException(即使用hql回调函数带参数时) 或者是 antlr.collections.AST ...

  9. hql删除mysql语句_hibernate -- HQL语句总结

    本章介绍了Hibernate的几种主要检索方式:HQL检索方式.QBC检索方式.SQL检索方式.HQL是Hibernate Query Language的缩写,是官方推荐的查询语言.QBC是Query ...

最新文章

  1. Python中函数的参数传递与可变长参数
  2. shell 命令行实现
  3. Android以当前Activity为基准进行截屏
  4. DICOM医学图像处理:DICOM存储操作之“多幅BMP图像数据存入DCM文件”
  5. android surfaceview 图片,为啥从SurfaceView中获取不到图片?
  6. 数据结构与算法--7.树的基础知识
  7. ajax传递复选框的参数,ajax将table复选框的数组值传递到后台
  8. 创建类(点击获得位置信息)—ArcGIS API for JavaScript
  9. MVC生成CheckBoxList并对其验证
  10. OpenGL中的glutInitDisplayMode()函数的理解
  11. Linux 语言包的安装
  12. ssq冷热号:子图之间间隔调整
  13. Activiti工作流引擎
  14. 华为多屏互动看学英语
  15. chrome 谷歌浏览器模拟各种手机设置userAgent
  16. GPU 资源消耗原因和解决方案:
  17. Servlet的一些操作
  18. 从共享单车到共享女友的一地鸡毛
  19. 利用电脑投放手机声音且可不冲突同时播放电脑声音的方法
  20. Joseph Darcy卸任OpenJDK 6负责人

热门文章

  1. c++重写卷积网络的前向计算过程,复现theano的测试结果
  2. Python 绘制椭圆 平移 旋转
  3. 线性回归——简单线性回归、多元线性回归
  4. 【故障诊断】基于最小熵反卷积、最大相关峰度反卷积和最大二阶环平稳盲反卷积等盲反卷积方法在机械故障诊断中的应用研究(Matlab代码实现)
  5. 关于weinre教程使用的补充(weinre-jar-1.6.1.zip下载)
  6. 论文中不带边框表格制作方法
  7. WifiManager自动连接wifi接入点
  8. 返回上一步编辑或者上几步或者想恢复删除的代码
  9. 监控摄像头的测试方法
  10. 【HBase】HBase phoenix 安装使用