一、参数查询

参数查询其实是使用等价代换的方法,使用设置的值替换字符串中指定位置的符号,或者通过使用参数名称,使用字符串来替换参数名称的值,这样能避免sql注入的问题,拼接字符串会出现sql注入的问题。hql提供了两种参数查询的方法,一种是通过使用符号“?”,然后使用setParameter方法设置替换的字符串;另外一种是使用参数名称,定义参数名称,并使用setParameter方法来替换指定参数名称的字串。

1.1 参数符号--?

通过使用符号?来设置要添加的参数内容,也就是说这里的符号?其实是hql的参数。如果想要为参数赋值,可以使用hql的方法setParameter,该方法重载参数,提供两个参数,一个能够传递参数出现的位置,另一个为参数赋值。具体如下代码:

  1. @SuppressWarnings({ "unchecked", "rawtypes" })
  2. public void testQuery(){
  3. Session session=null;
  4. try{
  5. session=HibernateUtils.getSession();
  6. session.beginTransaction();
  7. //方法链编程
  8. List students=session.createQuery("select s from Student s where s.name like ?").setParameter(0, "%0%").list();
  9. for(Iterator iter=students.iterator();iter.hasNext();){
  10. Student student=(Student)iter.next();
  11. System.out.println(student.getName());
  12. }
  13. session.getTransaction().commit();
  14. }catch(Exception e){
  15. e.printStackTrace();
  16. session.getTransaction().rollback();
  17. }finally{
  18. HibernateUtils.closeSession(session);
  19. }
  20. }

在需要使用参数的字串位置处使用?来代替,然后使用setParameter 方法,替换参数的内容。该方法中的第一个参数可以是字符串也可以是索引,如果使用了?作为参数,就必须指定?的第几个索引。

1.2 参数名称

上文已经讨论了符号参数的使用方法,并稍微简介了参数名称查询的方法,也就是说可通过使用参数名称的方法来定义参数,这种方法需要指定参数的名称,然后使用setParameter来设置名称替换参数,hql的参数定义是冒号+参数名。

  1. @SuppressWarnings({ "unchecked", "rawtypes" })
  2. public void testQuery(){
  3. Session session=null;
  4. try{
  5. session=HibernateUtils.getSession();
  6. session.beginTransaction();
  7. //可以采用 :参数名 的方式传递参数
  8. //方法链编程
  9. List students=session.createQuery("select s from Student s where s.name like :myname").setParameter("myname", "%0%").list();
  10. for(Iterator iter=students.iterator();iter.hasNext();){
  11. Student student=(Student)iter.next();
  12. System.out.println(student.getName());
  13. }
  14. session.getTransaction().commit();
  15. }catch(Exception e){
  16. e.printStackTrace();
  17. session.getTransaction().rollback();
  18. }finally{
  19. HibernateUtils.closeSession(session);
  20. }
  21. }

在上面的示例中使用了like模糊查询,查询在学生的姓名中有0出现的所有的学生信息,查询字符串中定义了一个名称为myname的参数,并使用setParameter为参数赋值。

1.3 参数集合

上文简单介绍了hql单个参数的使用方法,非常简单,那如果字串中需要配置多个连接的参数怎么办呢,那要使用setParameter一个个的进行赋值吗?hql提供了setParameterList来为参数舒服赋值,如下示例:

  1. @SuppressWarnings({ "unchecked", "rawtypes" })
  2. public void testQuery5(){
  3. Session session=null;
  4. try{
  5. session=HibernateUtils.getSession();
  6. session.beginTransaction();
  7. //可以采用 :参数名 的方式传递参数
  8. //方法链编程
  9. List students=session.createQuery("select s from Student s where s.id in(:ids)")
  10. .setParameterList("ids",new Object[]{1,2,3,4})
  11. .list();
  12. for(Iterator iter=students.iterator();iter.hasNext();){
  13. Student student=(Student)iter.next();
  14. System.out.println(student.getName());
  15. }
  16. session.getTransaction().commit();
  17. }catch(Exception e){
  18. e.printStackTrace();
  19. session.getTransaction().rollback();
  20. }finally{
  21. HibernateUtils.closeSession(session);
  22. }
  23. }

上例中使用了集合查询in,在集合中查询符合集合要求的内容,定义了名为ids的参数,参数的具体内容是一个对象集合,使用setParameterList为参数做了赋值。

二、函数查询

hql的具体查询提供了基本的sql查询方法,同样也支持对应数据库的函数查询方法,可以在查询语句中使用数据库函数来设置查询内容的格式及想要查询的内容,如日期格式函数date_format:

  1. @SuppressWarnings({ "unchecked", "rawtypes" })
  2. public void testQuery(){
  3. Session session=null;
  4. try{
  5. session=HibernateUtils.getSession();
  6. session.beginTransaction();
  7. //日期函数
  8. List students=session.createQuery("select s from Student s where date_format(s.createTime,'%Y-%m')=?")
  9. .setParameter(0,"2009-07")
  10. .list();
  11. for(Iterator iter=students.iterator();iter.hasNext();){
  12. Student student=(Student)iter.next();
  13. System.out.println(student.getName());
  14. }
  15. session.getTransaction().commit();
  16. }catch(Exception e){
  17. e.printStackTrace();
  18. session.getTransaction().rollback();
  19. }finally{
  20. HibernateUtils.closeSession(session);
  21. }
  22. }

上例中是按照学生信息的创建时间来查询相应的学生信息,通过使用date_format()方法来将字符串转化为相应查询内容的格式来获取的查询内容。

另外也可以使用数据库的between...and...来查询某一范围内的数据,如下示例查询某一时间段内的学生信息:

  1. @SuppressWarnings({ "unchecked", "rawtypes" })
  2. public void testQuery(){
  3. Session session=null;
  4. try{
  5. session=HibernateUtils.getSession();
  6. session.beginTransaction();
  7. //查询时间段
  8. List students=session.createQuery("select s from Student s where date_format(s.createTime,'%Y-%m') between ? and ?")
  9. .setParameter(0,"2009-07")
  10. .setParameter(1,"2012-07")
  11. .list();
  12. for(Iterator iter=students.iterator();iter.hasNext();){
  13. Student student=(Student)iter.next();
  14. System.out.println(student.getName());
  15. }
  16. session.getTransaction().commit();
  17. }catch(Exception e){
  18. e.printStackTrace();
  19. session.getTransaction().rollback();
  20. }finally{
  21. HibernateUtils.closeSession(session);
  22. }
  23. }

聚合查询,hql不支持*查询,但是可以使用count(*)查询。想要使用group by分组语句就必须在语句使用使用聚合函数。如下示例演示的是hql聚合函数和分组查询的使用方法:

  1. @SuppressWarnings({ "unchecked", "rawtypes" })
  2. public void testQuery(){
  3. Session session=null;
  4. try{
  5. session=HibernateUtils.getSession();
  6. session.beginTransaction();
  7. //返回结果集属性列表,元素类型和实体类中的属性类型一致
  8. List students=session.createQuery("select c.name,count(s) from Classes c join c.students s group by c.name order by c.name").list();
  9. for(Iterator ite=students.iterator();ite.hasNext();){
  10. Object[] obj=(Object[])ite.next();
  11. System.out.println(obj[0]);
  12. }
  13. session.getTransaction().commit();
  14. }catch(Exception e){
  15. e.printStackTrace();
  16. session.getTransaction().rollback();
  17. }finally{
  18. HibernateUtils.closeSession(session);
  19. }
  20. }

获取第一行,hql提供了方法来获取结果集中的第一行数据,该方法为uniqueResult(),通过使用sql语句来获取的结果集,然后在方法链中使用uniqueResult()方法来获取默认第一行的数据,如下代码:

  1. <pre name="code" class="java">@SuppressWarnings({ "unchecked", "rawtypes" })
  2. public void testQuery(){
  3. Session session=null;
  4. try{
  5. session=HibernateUtils.getSession();
  6. session.beginTransaction();
  7. //返回结果集属性列表,元素类型和实体类中的属性类型一致
  8. //List students=session.createQuery("select count(*) from Student").list();
  9. //Long count=(Long)students.get(0);
  10. //上面的查询方法,类似于下面使用的uniqueResult()方法
  11. Long count=(Long)session.createQuery("select count(*) from Student").uniqueResult();
  12. System.out.println("count="+count);
  13. session.getTransaction().commit();
  14. }catch(Exception e){
  15. e.printStackTrace();
  16. session.getTransaction().rollback();
  17. }finally{
  18. HibernateUtils.closeSession(session);
  19. }
  20. }

上面的代码示例提供了两种方法来获取第一行的数据,一种是通过使用get()方法,获取结果集中的第几行的内容;另外一种使用的是uniqueResult()方法来获取新行的内容。

三、查询过滤器

查询过滤器提供了对查询的内容进行过滤的过程,在映射文件中定义过滤器,程序中启用过滤器,并为过滤器参数赋值。具体步骤为:首先在要查询的实体对象的映射中使用<filter-def>标签配置过滤器,并在相对应的<class>标签中添加对应的<filter>过滤器;然后在对应的程序文件中使用enableFilter()方法启动过滤器,为过滤器定义的参数赋值,在执行时就会自动自行对应的过滤器。

清单一:映射文件,在映射文件中配置对应的过滤器,映射文件中定义了名为testFilter的过滤器,在class中为过滤器添加了执行条件,并在条件中添加了执行参数myid。

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <class name="com.src.hibernate.Student" table="t_student">
  7. <id name="id">
  8. <generator class="native"/>
  9. </id>
  10. <property name="name"/>
  11. <property name="createTime"></property>
  12. <!-- 在多的一端Student中添加一行新的Classes列 ,并且列的名称要和Classes.hbm.xml的列明相同-->
  13. <many-to-one name="classes" column="classesid"></many-to-one>
  14. <!-- 使用过滤器,指定id的内容要小于参数:myid配置的内容-->
  15. <filter name="testFilter" condition="id < :myid"></filter>
  16. </class>
  17. <!-- 定义查询过V领器 -->
  18. <filter-def name="testFilter">
  19. <filter-param type="integer" name="myid"></filter-param>
  20. </filter-def>
  21. </hibernate-mapping>

清单二:程序文件,在程序文件中使用enableFilter启用过滤器,并为过滤器的参数赋值。

  1. @SuppressWarnings({ "unchecked", "rawtypes" })
  2. public void testQuery(){
  3. Session session=null;
  4. try{
  5. session=HibernateUtils.getSession();
  6. session.beginTransaction();
  7. session.enableFilter("testFilter").setParameter("myid",10);
  8. //返回结果集属性列表,元素类型和实体类中的属性类型一致
  9. List students=session.createQuery("from Student").list();
  10. for(Iterator ite=students.iterator();ite.hasNext();){
  11. Student obj=(Student)ite.next();
  12. System.out.println(obj.getName());
  13. }
  14. session.getTransaction().commit();
  15. }catch(Exception e){
  16. e.printStackTrace();
  17. session.getTransaction().rollback();
  18. }finally{
  19. HibernateUtils.closeSession(session);
  20. }
  21. }

结语

hql的基本查询方法已经讨论完成,主要针对hql的使用过程中需要注意的内容作了详细的讨论,在每一种查询方法中都添加了相应的示例,通过示例加深对hql查询方法的使用,有sql基础的在使用hql时会非常的简单。

hql查询过滤器及相关聚合函数查询详解相关推荐

  1. hive的条件查询语句_Hive SQL 条件函数 IF 详解

    Hive SQL 条件函数 IF 是用于处理单个列的判断查询结果,形式为 if(条件表达式, 结果1, 结果2),相当于 java 中的三目运算符,只是 if 后面的表达式类型可以不一样. 语法说明 ...

  2. php函数查询sprintf,PHP之sprintf函数用法详解

    本文实例讲述了PHP中sprintf函数的用法.分享给大家供大家参考.具体用法分析如下: sprintf()函数在php官方是说把字符串格式化输出了,本文就来给各位朋友介绍一下在学习sprintf() ...

  3. php里注册管理员账号,WordPress中创建用户角色的相关PHP函数使用详解

    这篇文章主要介绍了WordPress中创建用户角色的相关函数使用,在WordPress的多用户模式中不同角色拥有不同的权限,需要的朋友可以参考下 WordPress 默认有 "订阅者&quo ...

  4. MySQL之聚合函数查询

    本文主要介绍一些关于聚合函数查询的语句. create table `t_grade` (`id` int ,`stuName` varchar (60),`course` varchar (60), ...

  5. mysql相关聚合函数应用商品分类表

    多表查询 一.多表之间建表关系分析 ​ 一对多:商品和分类 ​ 一对一:人和身份证(比较少) ​ 多对多:课程和学生 ​ 拆分成2个1对多的关系,建立一个中间表,让中间表的两个外键分别去指向两张表的主 ...

  6. mysql函数 用来查询匹配不到的数据_详解MySql基本查询、连接查询、子查询、正则表达查询...

    select * from STUDENT; 2.2.按条件查询 (1) 比较运算符 > , < ,= , != (< >),>= , <= select * fr ...

  7. 给Clouderamanager集群里安装基于Hive的大数据实时分析查询引擎工具Impala步骤(图文详解)...

    不多说,直接上干货! 这个很简单,在集群机器里,选择就是了,本来自带就有Impala的. 扩展博客 给Ambari集群里安装基于Hive的大数据实时分析查询引擎工具Impala步骤(图文详解) 欢迎大 ...

  8. oracle11g 常用函数(Functions)详解

    Oracle11g常用函数(Functions)详解 目录 ABS. 3 ACOS. 3 ADD_MONTHS. 4 ASCII 4 ASCIISTR. 5 ASIN.. 5 ATAN.. 5 ATA ...

  9. ajax.request函数使用详解

    ajax.request函数使用详解 Ajax.Request ? Ajax.Request( url, { method:method, parameters:para, postBody:xmlS ...

最新文章

  1. PowerDesigner脚本使用记录
  2. authpuppy mysql_authpuppy 认证服务器搭建
  3. Android 清除png图片的白色背景
  4. cmstop中实例化controller_admin_content类传递$this,其构造方法中接收到的是--名为cmstop的参数--包含cmstop中所有属性...
  5. python数据结构6 -二叉树
  6. EasyUI:中datagrid数据表格的删除、编辑、保存、撤销功能实现
  7. JS学习总结(5)——循环语句
  8. C# sqlsugar依赖引用报错的问题解决
  9. xml文件是什么?xml文档定义有几种形式?它们之间有何本质区别?解释xml文档又几种方式
  10. 如何破解加密的PDF文件
  11. idea快捷键:在上一行插入,在下一行插入
  12. mysql relay_mysql relay log参数汇总
  13. c语言大数乘方算法,用c语言实现大数乘方
  14. MySQL 零散知识整理~字符编码设置
  15. 给图片加水印的几种方法
  16. 现在, Delphi 的多线程已经非常易用了!
  17. 海思3559A平台4GB LPDDR配置方案
  18. Recent Trends in Deep Learning Based Natural Language Processing(arXiv)笔记
  19. 思维模型 DISC色彩性格
  20. gsl科学计算库文档,翻译了索引,凑合看看。

热门文章

  1. ansys里面自带chemkin_ANSYS CHEMKINPRO复杂化学反应快速仿真
  2. python模拟内置函数all_Python内置all函数详细介绍
  3. arcgis导出shp文件_RegionManager GIS导出shp文件编码说明
  4. unity DOTS的学习总结之Job System
  5. struts2 mysql配置文件路径_Struts2(四)Struts2配置文件的配置
  6. 容器安全 - 非特权/非root用户运行容器,提升容器的运行安全
  7. 使用TensorFlow.js进行AI在网络摄像头中翻译手势和手语
  8. ASP.NET Core 3.0 发布
  9. C#中的模块化软件开发
  10. c# -- 动态生成查询lamda表达式