博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate HQL详解
阅读量:4328 次
发布时间:2019-06-06

本文共 2832 字,大约阅读时间需要 9 分钟。

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

博客地址: 

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
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
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文件中,例如:

FROM User WHERE id BETWEEN ? AND ?

  在Java代码中

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

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

FROM User WHERE id BETWEEN :minId AND :maxId

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

  【Error】

FROM User WHERE id > :minId AND id< :maxId

  【Right】

 

FROM User WHERE id > :minId AND < :maxId

 

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

:minId AND < :maxId]]]]>

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

 

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

你可能感兴趣的文章
L2-003. 月饼
查看>>
jsp html5 video实现在线视频播放源码,支持IE6,7,8,10,11,谷歌,火狐等浏览器
查看>>
codeforces 8VC Venture Cup 2016 - Elimination Round C. Lieges of Legendre
查看>>
Eclipse断点调试(上)
查看>>
Spring的aop操作
查看>>
平差方法
查看>>
关于有序guid 的使用
查看>>
arcgis 画图工具
查看>>
[Leetcode]leetcode1-10题随记
查看>>
HDU 4162 Shape Number
查看>>
HDU 5211 Mutiple 水题
查看>>
linux中ctrl+z、ctrl+d和ctrl+c的区别
查看>>
mysql数据库的简单操作
查看>>
走过2013,走进2014
查看>>
修改tomcatlog输出等级
查看>>
数据结构 堆栈
查看>>
微信公众号开发C#系列-6、消息管理-普通消息接受处理
查看>>
RDIFramework.NET V2.9版本 WinFom部分新增与修正的功能
查看>>
AOP实战
查看>>
最大堆,最小堆及堆排序
查看>>