HQL
例如对于TUser类
1.实体查询
String hql = " from User";
执行这条语句会返回User以及User子类的纪录。
注: 如果 TUser 类具有外键, 查询结果不会报错,但结果中的外键为空值,访问就报空指针错误!
解决方法: select 别名.属性 from 类 as 别名. 没有别名.属性仍然报错! //此方法不一定能解决,但不会错.
hql = "from java.lang.Object"
会返回数据库中所有库表的纪录。
where 语句,as可以省略
hql = "from User as user where user.name='yyy'"; //user.name为类的属性
hql = "from User user where user.name='yyy'";
where子句中,我们可以通过比较运算符设定条件,如:
=, <>, >, <, >=, <=, between XX and XX, not between, in (xx,xx), not in, is, like %XX% 等。
2.属性查询
(1)List list = session.createQuery("select user.name, user.age from User user").list();
还可以在HQL中动态构造对象实例的方法,将数据封装。
(2)List list = session.createQuery("select new User(user.name, user.age) from TUser as user").list();
Iterator it = list.iterator();
while(it.hasNext() ) {
User user = (User)it.next();
System.out.println(user.getName());
}
但是要注意这里的User对象只是对name和age属性的封装,其他状态均未赋值,所以不能用它来进行更新操作。
也可以在HQL的Select子句中使用统计函数
"select count(*) ,min(user.age) from User as user"
也可以使用distinct关键字来删除重复纪录。
select distinct user.name from User as user;
3.实体的更新与删除
hibernate 3中,提供了更灵活的方式(bulk(集体) delete/update)
更新:
Query query = session.createQuery("update User set age=18 where id=1"); //age==User.age
query.executeUpdate();
删除:
session.createQuery("delete User where age>=18");
query.executeUpdate();
4.分组与排序
Order by子句:
from User user order by user.name, user.age desc
Group by子句和Having子句
"select count(user), user.age from User user group by user.age having count(user)>10"
5.参数邦定
通过顺序占位符?来填充参数:
1)hibernate 2 中通过session.find方法来填充
session.find("from User user where user.name=?", "Erica", Hibernate.STRING);
多个参数的情况:
Object[] args = new Object[] {"Erica", new Integer(20)};
Type[] types = new Type{Hibernate.STRING, Hibernate.INTEGER};
session.find("from TUser user where user.name=? and user.age=?", args, types);
2)通过Query接口进行参数填充:
Query query = session.createQuery("from User user where user.name=? and user.age>?");
query.setString(0,"Erica");
query.setInteger(1, 20);
通过引用占位符来填充参数:
String hql = "from User where name=:name";
Query query = session.createQuery(hql);
query.setParameter("name","Erica");
甚至可以将查询条件封装为一个JavaBean
class UserQuery {
private String name;
private Integer age;
//getter and setter
}
String hql = "from TUser where name=:name and age=:age";
Query query = session.createQuery(hql);
UserQuery uq = new UserQuery();
uq.setName("Erica");
uq.setAge(new Integer(20));
query.setProperties(uq); //会调用里面的getter?
query.iterate();
6.联合查询
(org.hibernate.LazyInitializationException: could not initialize proxy - no Session 异常,可能是HQL语句没有进行联表查询,产生访问的属性不存在.)
User表: id, name
Addresses表: user_id, addresses
(1)自然联接(内联接): inner join [fetch]
1.HQL: from User u inner join fetch u.addresses
SQL: select * from User表 u inner join Addresses a on u.id=a.user_id //u.id=a.user_id在XML中已配置,所以可以省略.
fetch: Addresses对象读出后,立即填充到User对象对应的外键(集合)中.
2.HQL: from User u inner join u.addresses
不加fetch,则返回的结果集中的每一条记录是一个Object数组,数组包括User和Addresses两个对象, 并且User对象.addresses集合已被Addresses对象自动填充.
(2)左连接: left outer join [fetch]
同(1), 返回的结果不同而已.
(3)右连接: right out join
fetch无效,因为User对象可能为NULL,无法进行填充,但返回结果里的记录是数组.
(4)笛卡尔交集: full join (使用很少)
同(3), 返回结果不同而已.
(5)笛卡尔集: 排列组合:form User, Address
联合查询如有不懂, 详见SQL联合语句:
SQL中的left outer join,inner join,right outer join用法: http://www.blogjava.net/algz/articles/228219.html
SQL中的各种JOIN(inner join,full outer join,left join,right join,cross join ):http://www.blogjava.net/algz/articles/228218.html
sql的left join 命令详解 : http://www.blogjava.net/algz/articles/228220.html
分享到:
相关推荐
### HQL语法总结:实体查询详解 #### 一、实体查询概述 HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者以一种类似于SQL但更接近于面向对象的方式来编写查询。本文将详细介绍HQL中的实体...
在这个文档中,我们将深入讲解HQL以及相关的Hibernate配置。 首先,我们看到两个XML文件,它们是Hibernate的映射文件,定义了Java对象(如`com.bjsxt.hibernate.Student`和`com.bjsxt.hibernate.Classes`)与数据库...
5. 删除(Delete):通过Session的delete()方法删除对象,Hibernate会处理相关的外键约束问题。 五、级联操作 在多表关联中,级联操作可以帮助我们一次性处理关联对象。例如,当删除一个部门时,可以同时删除所有...
3. **实体映射**:Hibernate通过XML文件(hbm.xml)或注解方式定义对象与数据库表的映射关系,包括字段、主键、外键、关联关系等。手册会详细解析这些映射元素的使用。 4. **CRUD操作**:Hibernate提供了简单易用的...
根据提供的文件信息,“邹波hibernate50讲”这一视频教程主要涵盖了Hibernate框架的相关知识点。Hibernate是一个开源的对象关系映射(Object Relational Mapping,简称ORM)框架,它为Java应用提供了一种将对象模型...
HQL语法与SQL语法在很多方面类似,但它更加面向对象。手册会详细介绍如何编写HQL查询语句,使用HQL进行数据的增删改查操作,以及如何使用HQL的高级特性,如投影查询、分组、排序等。 3. 常用版本:在手册中,会涉及...
此外,还讲解了Criteria查询、HQL(Hibernate Query Language)和JPQL(Java Persistence Query Language)的语法和优势,这些强大的查询工具使开发者可以编写更加简洁和高效的代码。 综上所述,这三份文档全面覆盖...
- **选项b)持久化对象建立关联关系可以跟数据库表建立关系方式是一样的**:虽然表面上看起来相似,但在Hibernate中,对象关联是通过属性来实现的,而数据库中的关联通常依赖于外键,两者在实现机制上有所不同。...
- Criteria API或HQL(Hibernate Query Language):用于查询数据库,比原生SQL更面向对象,支持动态查询。 5. **可能出现的问题**: - 配置错误:检查数据库连接信息是否正确,映射文件路径是否匹配。 - 关联...
9. **Association Mapping**:Hibernate支持多种关联映射,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany),使对象间的关联关系能够映射到数据库表的外键关系。 10. **...
HQL语法类似于SQL,但更加面向对象,支持关联查询、多态查询和聚集函数等高级特性。 通过深入理解Hibernate的这些核心概念和技术,开发者可以构建出高效、健壮且易于维护的Java应用程序。无论是初学者还是经验丰富...
这部分可能包含了HQL的基本语法、查询构造、聚合函数和子查询等内容。 8. **hibernate_one2one_ufk_2**:这可能涉及到一对一关系的无外键映射,即两个实体之间没有直接的数据库外键关系。文件可能讲解了如何通过...
3. **HQL检索**:HQL(Hibernate Query Language)是一种面向对象的查询语言,类似于SQL,但语法更接近面向对象的概念。HQL支持多种查询方式,如选择、排序等。 4. **QBC检索**:QBC(Query By Criteria)是一种基于标准...
这节课将介绍HQL的基本语法,包括选择、聚合函数、连接、子查询等,并演示如何在代码中执行HQL查询。 3. **Hibernate的关联映射**: 在关系数据库中,表与表之间的关联在Hibernate中通过对象间的引用实现。你将...
- **唯一外键关联映射**:通过唯一外键来关联两个实体。 - **一对多关联映射**: - **单向关联**:一方只知道另一方的存在,但另一方不知道这一方。 - **双向关联**:双方都知道对方的存在。 - **多对多关联...
6. **查询语言**:掌握HQL和Criteria API两种主要的查询方式,HQL允许使用类似于SQL的语法进行查询,而Criteria API则提供了一种更灵活的构建查询条件的方式。 7. **性能优化**:了解如何优化Hibernate的性能,包括...
HQL支持基本的SQL语法结构,并且还支持对象和集合的导航: ```java Session session = sessionFactory.openSession(); Query query = session.createQuery("from Customer where name = :name"); query....