Hibernate HQL详解
来源:互联网 发布:中国软件杯大赛 编辑:程序博客网 时间:2024/06/08 10:07
版权声明:本文为博主原创文章,如需转载请标注转载地址。
博客地址: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 > :minId AND < :maxId</query>
虽然上面的方式我们可以正确执行,但是代码显示不够友好,所有我们推荐使用下面的一种方式
<query name="queryUserRanage"> <![CDATA[FROM User WHERE id > :minId AND < :maxId]]</query>
CDATA代码块说明在代码中的语句不需要转义,我们一个HQL都推荐用CDATA块来包裹着
- Hibernate HQL 语法详解
- hibernate hql 详解
- Hibernate HQL语言详解
- Hibernate HQL详解
- Hibernate:HQL详解
- hibernate HQL 语句详解
- Hibernate Hql详解
- Hibernate的HQL详解
- Hibernate HQL详解
- Hibernate HQL详解
- Hibernate HQL简单详解
- JAVA Hibernate HQL查询、详解
- Hibernate查询值HQL详解
- Hibernate查询语言HQL详解
- Hibernate(4)hibernate的HQL详解
- Hibernate查询语言:HQL 详解(转载)
- HQL(Hibernate Query Language)使用详解
- Hibernate学习之HQL详解1
- UTC方法简单了解
- Netty系列之Netty线程模型
- maven项目发布到tomcat里lib包没有发布的问题
- Eclipse 使用ant打jar包报错
- 技术文章网址收藏
- Hibernate HQL详解
- Container With Most Water
- Kotlin入门第一课
- golang 真正的高并发用法 查找素数
- 标签data-*自定义属性值和根据data属性值查找对应标签
- 程序员需要具备的职业素养
- 解决bootstrap 中解决表格中内容过大而页面杂乱问题
- 安卓中WebView的常用方法
- 关于java泛型擦除反编译后泛型会出现问题