`

Hibernate HQL 语法 及相关的外键关联

阅读更多
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语法总结:实体查询详解 #### 一、实体查询概述 HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者以一种类似于SQL但更接近于面向对象的方式来编写查询。本文将详细介绍HQL中的实体...

    hql详细讲解,实例演示

    在这个文档中,我们将深入讲解HQL以及相关的Hibernate配置。 首先,我们看到两个XML文件,它们是Hibernate的映射文件,定义了Java对象(如`com.bjsxt.hibernate.Student`和`com.bjsxt.hibernate.Classes`)与数据库...

    用hibernate操作多表的例子

    5. 删除(Delete):通过Session的delete()方法删除对象,Hibernate会处理相关的外键约束问题。 五、级联操作 在多表关联中,级联操作可以帮助我们一次性处理关联对象。例如,当删除一个部门时,可以同时删除所有...

    Hibernate_3.2中文手册(chm+pdf)

    3. **实体映射**:Hibernate通过XML文件(hbm.xml)或注解方式定义对象与数据库表的映射关系,包括字段、主键、外键、关联关系等。手册会详细解析这些映射元素的使用。 4. **CRUD操作**:Hibernate提供了简单易用的...

    hibernate视频

    根据提供的文件信息,“邹波hibernate50讲”这一视频教程主要涵盖了Hibernate框架的相关知识点。Hibernate是一个开源的对象关系映射(Object Relational Mapping,简称ORM)框架,它为Java应用提供了一种将对象模型...

    Hibernate v3.2中文参考手册

    HQL语法与SQL语法在很多方面类似,但它更加面向对象。手册会详细介绍如何编写HQL查询语句,使用HQL进行数据的增删改查操作,以及如何使用HQL的高级特性,如投影查询、分组、排序等。 3. 常用版本:在手册中,会涉及...

    Hibernate学习文档集合

    此外,还讲解了Criteria查询、HQL(Hibernate Query Language)和JPQL(Java Persistence Query Language)的语法和优势,这些强大的查询工具使开发者可以编写更加简洁和高效的代码。 综上所述,这三份文档全面覆盖...

    Hibernate 练习题

    - **选项b)持久化对象建立关联关系可以跟数据库表建立关系方式是一样的**:虽然表面上看起来相似,但在Hibernate中,对象关联是通过属性来实现的,而数据库中的关联通常依赖于外键,两者在实现机制上有所不同。...

    hibernate学生-课程-成绩

    - Criteria API或HQL(Hibernate Query Language):用于查询数据库,比原生SQL更面向对象,支持动态查询。 5. **可能出现的问题**: - 配置错误:检查数据库连接信息是否正确,映射文件路径是否匹配。 - 关联...

    hibernate5.0jar包

    9. **Association Mapping**:Hibernate支持多种关联映射,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany),使对象间的关联关系能够映射到数据库表的外键关系。 10. **...

    Hibernate_教程

    HQL语法类似于SQL,但更加面向对象,支持关联查询、多态查询和聚集函数等高级特性。 通过深入理解Hibernate的这些核心概念和技术,开发者可以构建出高效、健壮且易于维护的Java应用程序。无论是初学者还是经验丰富...

    hibernate学习资料

    这部分可能包含了HQL的基本语法、查询构造、聚合函数和子查询等内容。 8. **hibernate_one2one_ufk_2**:这可能涉及到一对一关系的无外键映射,即两个实体之间没有直接的数据库外键关系。文件可能讲解了如何通过...

    Hibernate常见面试题

    3. **HQL检索**:HQL(Hibernate Query Language)是一种面向对象的查询语言,类似于SQL,但语法更接近面向对象的概念。HQL支持多种查询方式,如选择、排序等。 4. **QBC检索**:QBC(Query By Criteria)是一种基于标准...

    hibernate学习课件

    这节课将介绍HQL的基本语法,包括选择、聚合函数、连接、子查询等,并演示如何在代码中执行HQL查询。 3. **Hibernate的关联映射**: 在关系数据库中,表与表之间的关联在Hibernate中通过对象间的引用实现。你将...

    hibernate学习笔记

    - **唯一外键关联映射**:通过唯一外键来关联两个实体。 - **一对多关联映射**: - **单向关联**:一方只知道另一方的存在,但另一方不知道这一方。 - **双向关联**:双方都知道对方的存在。 - **多对多关联...

    hibernate中文ppt详解配置

    6. **查询语言**:掌握HQL和Criteria API两种主要的查询方式,HQL允许使用类似于SQL的语法进行查询,而Criteria API则提供了一种更灵活的构建查询条件的方式。 7. **性能优化**:了解如何优化Hibernate的性能,包括...

    hibernate基础 注解开发 检索

    HQL支持基本的SQL语法结构,并且还支持对象和集合的导航: ```java Session session = sessionFactory.openSession(); Query query = session.createQuery("from Customer where name = :name"); query....

Global site tag (gtag.js) - Google Analytics