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

博客地址: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,如果返回值不唯一,则抛出异常

 Object name= session.createQuery(hql).uniqueResult();
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块来包裹着

Hibernate HQL详解的更多相关文章

  1. hibernate Expression详解

    关键字: hibernate expression hibernate Expression详解Expression.gt:对应SQL条件中的"field > value " ...

  2. (转)spring hibernate properties详解

    转载地址:http://blog.sina.com.cn/s/blog_692d0a650100xyqx.html Hibernate配置属性 hibernate.dialect:一个Hibernat ...

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

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

  4. Hibernate配置文件详解

    Hibernate配置方式 Hibernate给人的感受是灵活的,要达到同一个目的,我们可以使用几种不同的办法.就拿Hibernate配置来说,常用的有如下三种方式,任选其一. 在 hibernate ...

  5. hibernate二级缓存ehcache hibernate配置详解

    <!-----------------hibernate二级缓存ehcache------------------------->hibernate配置 <prop key=&quo ...

  6. Hibernate配置详解

    <!--标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的编码方式--> <?xml version='1.0' ...

  7. HQL详解

    HQL查询:Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此 Hib ...

  8. Hibernate入门详解

    学习Hibernate ,我们首先要知道为什么要学习它?它有什么好处?也就是我们为什么要学习框架技术? 还要知道    什么是Hibernate?    为什么要使用Hibernate?    Hib ...

  9. Hibernate 配置详解(8)

    hibernate.generate_statistics 这个配置大家应该都很熟悉,用于开启Hibernate统计信息,便于对Hibernate相关性能调试提供数据依据.在开发过程当中,可以把这个选 ...

随机推荐

  1. FlowPortal BPM官网改版了,推出20个流程免费基础版

    我一直使用的FlowPortal BPM官网网站近期改版了,看起来更加高大上了.不仅美感提高了,所传递的信息,特别是新老用户所需要的信息也更多了. 对于新版网站,我觉得比较赞的地方: 1.新增开发者中 ...

  2. Sass和Compass的安装

    Sass和Compass都是基于Ruby编程语言的命令行工具.要使用它们,你首先需要在电脑中安装Ruby,并对电脑的命令行操作有一个基本的理解.Sass和Compass可以安装在Windows.Mac ...

  3. BZOJ 2733 [HNOI2012]永无乡(启发式合并+Treap+并查集)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2733 [题目大意] 给出n个点,每个点都有自己的重要度,现在有连边操作和查询操作, 查 ...

  4. 【MySQL笔记】数据库的查询

    数据库的查询 注:文中 [ ...] 代表该部分可以去掉. 理论基础:对表对象的一组关系运算,即选择(selection).投影(projection)和连接(join) 1.select语句 子语句 ...

  5. mongodb安装和配置,遇到问题和解决方法

    自己不知道怎么的,心血来潮想重新来安装和配置一下mongodb,之前自己也是按照别人的来整的,印象不深刻.第二遍安装配置遇到很多问题. 弄了两个多小时,期间遇到很多问题: 遇到的主要问题 1.拒绝访问 ...

  6. Hiho----无间道之并查集

    题目: 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 这天天气晴朗.阳光明媚.鸟语花香,空气中弥漫着春天的气息……额,说远了,总之,小Hi和小Ho决定趁着这朗朗春光出去 ...

  7. 跟着我从零开始入门FPGA(一周入门XXOO系列)-1、Verilog语法

    (本连载共七部分,这是第一部分) 作者:McuPlayer2013   (EETOP FPGA版块版主) 原帖地址:http://bbs.eetop.cn/thread-385362-1-1.html ...

  8. phantomjs 抓取房产信息

    抓取https://sf.taobao.com/item_list.htm信息 driver=webdriver.PhantomJS(service_args=['--ssl-protocol=any ...

  9. CF(D. Fibonacci Sums)dp计数

    题目链接:http://codeforces.com/contest/126/problem/D 题意:一个数能够有多种由互不同样的斐波那契数组成的情况: 解法:dp,easy证明:每一个数通过贪心能 ...

  10. android apktool 基本的安装与使用

    apktool: 1. 安装 http://ibotpeaches.github.io/Apktool/install/ 2. 基本使用 http://ibotpeaches.github.io/Ap ...