Hibernate查询语言总结
来源:互联网 发布:北京好的体检医院 知乎 编辑:程序博客网 时间:2024/06/06 04:24
Hibernate查询语言总结
一 简介
Hibernate配置了一种非常强大的查询语言,这种语言看上去很想sql,但是不要被语法结构上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态和关联之类的概念
Hibernate的查询的语言对大小写不敏感
二 各种常用的查询
1.from查询语句 --- 最简单的查询语句,返回的是实体类的集合
查询语句的语法:
from Customers
from Customers as c 或 from Customers c
List<Customers> list = session.createQuery("from Customers").list();
for (Customers entity : list) {
System.out.println(entity.getRealName());
}
注:查询的语言别名的as可以省去,并且在写的时候别名都是小写的是最好的习惯。
2.关联和连接(join)查询
Hql的查询分为内连接,左外连接,右外连接,全连接,在sql中不支持全连接。
下面分别来介绍一下连接
(1)内连接 内连接也称自然连接,是hibernate内部自己执行的的。
Query query = session
.createQuery("from Customers as c inner join c.orders as o");
List<Object[]> list = query.list();
for (Object[] a : list) {
System.out.println();
}
执行的sql语句为:
Hibernate: select customers0_.id as id0_0_, orders1_.id as id1_1_, customers0_.realName as realName0_0_, customers0_.pass as pass0_0_, customers0_.sex as sex0_0_, customers0_.petName as petName0_0_, customers0_.email as email0_0_, customers0_.rdate as rdate0_0_, orders1_.number as number1_1_, orders1_.address as address1_1_, orders1_.phone as phone1_1_, orders1_.odate as odate1_1_, orders1_.sum as sum1_1_, orders1_.status as status1_1_, orders1_.cid as cid1_1_ from customers customers0_ inner join orders orders1_ on customers0_.id=orders1_.cid
(2)左外连接 语句的查询为:
Query query = session
.createQuery("select c.id,c.realName,o.id,o.number from Customers as c left join c.orders as o where c.id=1");
List<Object[]> list = query.list();
for (Object[] a : list) {
System.out.println(a[0] + "==" + a[1] + "==" + a[2] + "==" + a[3]);
}
查询的sql语句为:
Hibernate: select customers0_.id as col_0_0_, customers0_.realName as col_1_0_, orders1_.id as col_2_0_, orders1_.number as col_3_0_ from customers customers0_ leftouter join orders orders1_ on customers0_.id=orders1_.cid where customers0_.id=1
(3)右外连接 查询的语句为:
Query query = session
.createQuery("select c.id,c.realName,o.id,o.number from Customers as c right join c.orders as o where c.id=1");
List<Object[]> list = query.list();
for (Object[] a : list) {
System.out.println(a[0] + "==" + a[1] + "==" + a[2] + "==" + a[3]);
}
执行的sql语句为:
Hibernate: select customers0_.id as col_0_0_, customers0_.realName as col_1_0_, orders1_.id as col_2_0_, orders1_.number as col_3_0_ from customers customers0_ right outer join orders orders1_ on customers0_.id=orders1_.cid where customers0_.id=1
注:
(1)查询的时候查询的语句为where,而不是on。
3.投影查询
查询的语句为:
List<Object[]> list = session.createQuery(
"select c.realName,c.petName from Customers as c").list();
for (Object[] c : list) {
System.out.println("petName====" + c[0] + "------realName=" + c[1]);
}
查询的结果为:
Hibernate: select customers0_.realName as col_0_0_, customers0_.petName as col_1_0_ from customers customers0_
petName====熊熊------realName=老王
petName====老王------realName=熊熊
如果在查询的时候查询的语句省去select c.realName,c.petName,得到的是一个List<Customers>集合对象,而不是数组
询*所有得到的是一个数组对象,在from前不可以加任何语句,如果加语句的话,返回的就是一个数组
// List<Object[]> list =
// session.createQuery("select id,realName,pass,sex from Customers").list();
List<Customers> list = session.createQuery("from Customers").list();
for (Customers entity : list) {
System.out.println(entity.getRealName());
}
4. Cireria两张表的关系查询
根据条件查询出两张表都符合的字段
List<Customers> entity = session.createCriteria(Customers.class)
.add(Restrictions.like("realName", "%熊%"))
.createCriteria("orders").add(Restrictions.like("number", "1")).list();
for (Customers entities : entity) {
System.out.println(entities.toString());
}
以上的查询的意思:
因为用Cireria查询的时候在外没有条件,所以要用add()方法去给它赋条件,用createCriteria去指定给哪一个实体类赋条件。
查询的sql语句为:
Hibernate: select this_.id as id0_1_, this_.realName as realName0_1_, this_.pass as pass0_1_, this_.sex as sex0_1_, this_.petName as petName0_1_, this_.email as email0_1_, this_.rdate as rdate0_1_, orders1_.id as id1_0_, orders1_.number as number1_0_, orders1_.address as address1_0_, orders1_.phone as phone1_0_, orders1_.odate as odate1_0_, orders1_.sum as sum1_0_, orders1_.status as status1_0_, orders1_.cid as cid1_0_ from customers this_ inner join orders orders1_ on this_.id=orders1_.cid where this_.realName like ? and orders1_.number like ?
5.标量查询 SQLQuery
查询的语句为:
// 把数组转换为实体类,运用addEntity()方法
List<Customers> entities = session
.createSQLQuery("select * from customers")
.addEntity(Customers.class).list();
for(Customers entity:entities){
System.out.println(entity.getRealName()+"==="+entity.getPetName());
}
执行的sql语句为:
Hibernate: select * from customers
注:标量查询和sql查询的语句一样
以上这几种查询都是hql中最常见的查询,必须要牢记!
- Hibernate查询语言总结
- hibernate的HQL查询语言总结
- HQL: Hibernate查询语言简要总结
- hibernate的HQL查询语言总结
- Hibernate查询语言:HQL
- Hibernate 查询语言(HQL)
- Hibernate查询语言:HQL
- Hibernate查询语言:HQL
- Hibernate查询语言:HQL
- Hibernate查询语言:HQL
- Hibernate查询语言:HQL
- Hibernate查询语言:HQL
- Hibernate查询语言:HQL
- Hibernate查询语言:HQL
- Hibernate查询语言HQL
- HQL: Hibernate查询语言
- HQL: Hibernate查询语言
- Hibernate查询语言HQL
- 133. Every advantage has its disadvantage. 有得必有弊
- 三分钟开始你的 rails之旅
- 组织行为学笔记:第七章 领导与监督
- 2011回顾:20个将JavaScript推到极致的网站
- 读书时间 2011/12/28
- Hibernate查询语言总结
- 在myeclipse下,打开已有的项目
- CentOS6上安装xfce桌面环境
- C# WinForm 导出导入Excel/Doc 完整实例教程
- 用类降低业务逻辑复杂度
- c3p0详细配置
- Windows下JAVA调用动态库(一)--基本实现
- Python实战之Oracle数据库操作
- “电脑族”保健六项注意