版权声明:本文为博主原创文章,如需转载请标注转载地址。

博客地址:http://www.cnblogs.com/caoyc/p/5606444.html 

1、实体查询:

  hql="FROM User";

List list= session.createQuery(hql).list();

 for(Object obj:list){
  System.out.println(obj);
  }

  【注意】:HQL语句中关键字不区分大小写,但是实体类和对象属性要区分大小写

2、查询某个对象的某个属性

  hql="SELECT name FROM User where id=1";

  方式一:

Object name= session.createQuery(hql).list().get(0);
System.out.println(name);

  这种方式不被推荐,当如果id=0的User对象不存在是,使用get(0)会抛出异常,我们通常使用下面这种方式

  方式二:通过uniqueResult()方法,该方法返回一个Object对象,如果对象不存在则返回null,如果返回值不唯一,则抛出异常

1 Object name= session.createQuery(hql).uniqueResult();
2 System.out.println(name)

3、查询其中几列数据,返回一个数组

  hql="SELECT id,name FROM User";

List list= session.createQuery(hql).list();
for(Object obj:list){System.out.println(Arrays.toString((Object[])obj));
}

  list()返回的是一个List<Object>对象

4、查询其中几列数据,返回一个实体类

  hql="SELECT new User(id,name) FROM User";

List<User> list= session.createQuery(hql).list();
for(User user:list){System.out.println(user);
}

  HQL通过new的方式可以返回一个新的实体类,比如说上面通过new User(id,name)方式将id,name返回给User,要求User必须包含一个相对应的构造函数,否则会抛出异常,同时我们还有应该给User指定一个默认的构造函数,否则使用From User也会抛出异常,因为这种方式采用的是默认构造。值得注意的是,如果使用的新构造对象,那么处理指定的属性会被赋予新值外,其它属性均为默认值。

  

5、WHER、GROUP BY、HAVING和ORDER综合使用

  hql="SELECT age, COUNT(age) num FROM User WHERE age>10 GROUP BY age HAVING COUNT(age)>1 ORDER BY num DESC";

  在HAVING中,不能使用别名num,但在ORDER BY中可以使用别名num

6、使用占位符"?"

  hql="FROM User where id=?";

User user= (User)session.createQuery(hql).setParameter(0, 2).uniqueResult();
System.out.println(user);

  Hibernate和JDBC占位符的区别:在Hibernate占位符下标从0开始,在JDBC中的占位符下标从1开始

7、使用参数

  hql="FROM User where id=:id";

User user= (User)session.createQuery(hql).setParameter("id", 2).uniqueResult();
System.out.println(user);

  使用参数的方式,在HQL中在参数前面需要加上冒号

8、使用集合或数组参数

  hql="FROM User where id IN (:ids)";

List<User> list= session.createQuery(hql).setParameterList("ids", new Object[]{1,3,4}).list();
for (User user : list) {System.out.println(user);
}

9、使用命名方式查询

  如果我们将HQL代码写在类中,那么编译后我们非常难以维护,为了后期代码的可维护行,我们需要将HQL代码写在对应类的.hbm.xml文件中,例如:

<query name="queryUserRanage">FROM User WHERE id BETWEEN ? AND ?
</query>

  在Java代码中

Query query=session.getNamedQuery("queryUserRanage");
List<User> list=query.setParameter(0, 10).setParameter(1, 20).list();
for(User user:list){System.out.println(user);
}

  通常我们使用参数的方式,这样可以很直观知道每个参数的作用

<query name="queryUserRanage">FROM User WHERE id BETWEEN :minId AND :maxId
</query>

  但是如果在SQL语句中存在>、<等xml中特殊字符,这些字符在xml中都有特殊的意义,所有我们不能直接这样写

  【Error】

<query name="queryUserRanage">FROM User WHERE id > :minId AND id< :maxId
</query>

  【Right】

<query name="queryUserRanage">FROM User WHERE id &gt; :minId AND &lt; :maxId
</query>

  虽然上面的方式我们可以正确执行,但是代码显示不够友好,所有我们推荐使用下面的一种方式

<query name="queryUserRanage"><![CDATA[FROM User WHERE id > :minId AND < :maxId]]
</query>

  CDATA代码块说明在代码中的语句不需要转义,我们一个HQL都推荐用CDATA块来包裹着

转载于:https://www.cnblogs.com/caoyc/p/5606444.html

Hibernate HQL详解相关推荐

  1. Hibernate配置详解

     一.简单介绍   Hibernate是一种对JDBC做了轻量级封装的对象---关系映射工具,所谓轻量级封装,是指Hibernate并没有完全封装JDBC,Java应用即可以通过Hibernate ...

  2. Java程序员从笨鸟到菜鸟之(五十一)细谈Hibernate(二)开发第一个hibernate基本详解...

    在上篇博客中,我们介绍了<hibernate基本概念和体系结构>,也对hibernate框架有了一个初步的了解,本文我将向大家简单介绍Hibernate的核心API调用库,并讲解一下它的基 ...

  3. 【Hibernate】Hibernate查询语言HQL详解

    常用的HQL语句 HQL: Hibernate Query Language. 特点: 1,与SQL相似,SQL中的语法基本上都可以直接使用. 2,SQL查询的是表和表中的列:HQL查询的是对象与对象 ...

  4. hibernate缓存详解

    hibernate中提供了两级缓存,一级缓存是Session级别的缓存,它属于事务范围的缓存,该级缓存由hibernate管理,应用程序无需干预:二级缓存是SessionFactory级别的缓存,该级 ...

  5. Hibernate注解详解(超全面)

    注解虽然配置简单易懂,但是对于复杂点的数据结构,配置起来反而比xml难(例如用xml配置,因为有帮助文件dtd的支持,因此能很好的利用提示来帮助编程,而注解代码提示不会呈现出项目中所有相关的类,如果你 ...

  6. hibernate Expression详解

    Expression.gt:对应SQL条件中的"field > value ".如:Expression.gt("salary", new Integer ...

  7. Hibernate映射详解(二)--多对一,一对多单向,一对多双向关联映射

    在我们以前的数据库设计中,设计表就不是一件轻松的事情.多种事物之间往往都是有这样那样的关系的.那怎样设计表格,才能既将事情描述明白,又能使数据库设计的比较合理呢?那里我们提供了好多规范,好多约束来满足 ...

  8. myeclipse添加使用hibernate框架详解

    1,首先建一个web工程testhibernate,然后点击菜单上的"MyEclipse"选择如下: 2,接下来会让你选择hibernate.cfg.xml的存放位置这就不说了,接 ...

  9. 【大话Hibernate】hibernate缓存详解

    为什么要用hibernate缓存? hibernate是一个持久层框架,经常访问物理数据库.为了降低应用程序对物理数据源访问的次数,从而提高应用程序的运行性能,我们想到使用hibernate缓存机制. ...

  10. Hibernate 配置详解(5)

    9) hibernate.batch_fetch_style: 该配置是hibernate4.2.0新添加的,使用这个设置可以配置hibernate在做batch-fetch的时候,生成SQL的策略. ...

最新文章

  1. WPF学习拾遗(二)TextBlock换行
  2. 科学养猪的真正奥义,培养拯救人类的医学英雄
  3. Python基础总结(5)
  4. zabbix——拓扑图入门
  5. 【Alpha】开发日志Day4-0715
  6. QQ开心农场外挂软件设计思路
  7. postgresql介绍,安装,启动
  8. MATLAB double、str、cell间的类型转换
  9. 修改npm全局安装模式的路径
  10. dataframe记录数_大数据系列之Spark SQL、DataFrame和RDD数据统计与可视化
  11. websocket 发送多条消息如何判断全部接收_Websocket的分布式集群开发及部署
  12. html超链接点不了_Html使文本可点击而不会超链接
  13. alpha-beta剪枝算法
  14. 请设计输出实数的格式,包括:(1)一行输出一个实数;(2)一行输出两个实数;(3)一行输出三个实数。实数用%6.2f格式输出。
  15. 【ARCore 入门开发课程系列】ARCore 打造沉浸式体验全过程
  16. 虚拟服务器 重置密码,vmware Esxi 5.0 忘记密码重置的方法
  17. 电脑连上了WIFI,但是却没有网(前提WIFI没有问题)
  18. uniapp获取屏幕宽度的方式_uni-app如何实现rem自适应手机屏幕尺寸?
  19. 22考研初试410数一145上岸上海交通大学819经验分享
  20. 无固定公网IP,群晖动态解析域名到动态公网IP

热门文章

  1. JUC与JVM并发编程学习笔记02
  2. pytorch与Keras对应模型Sequential()和add()
  3. .sql文件导入mysql数据库中
  4. python求解给定一个整数N,求N!末尾有多少个0,求N!的二进制中最低位1的位置
  5. scala学习笔记一------初步了解scala
  6. python写的crf训练代码
  7. flutter text 左对齐_【Flutter学习】基本组件之文本组件Text
  8. can总线一帧多少字节多少位_一条CAN报文到底有多少位?-汽车电子-与非网
  9. JDK动态代理执行过程分析
  10. web3sdk 怎么配置连接区块链节点