10. 使用 HQL 对表和字段的操作转化为对对象和属性的操作 HQL 查询非常类似于标准 SQL 查询 完整的 HQL 语句形势如下: Select/update/delete…… from …… where …… group by …… having …… order by …… asc/desc update/delete 为 Hibernate3 中所新添加的功能
11. 实体查询 执行结果是,查询出 User 实体对象所对应的所有数据,而且将数据封装成 User 实体对象,并且放入 List 中返回 Hibernate 的实体查询存在着对继承关系的判定 , 查询超类 会检索出所有超类和子类类型实体对象所对应的数据 与标准 SQL 语句相似,可以在 HQL 语句中使用 where 字句,且使用各种表达式,比较操作符以及使用“ and”,”or” 连接不同的查询条件的组合 String hql=”from User user ”; List list=session.CreateQuery(hql).list(); 持久类 别名 from User user where user.age=20; from User user where user.age between 20 and 30; from User user where user.age in(20,30); from User user where user.name is null; from User user where user.name like ‘%zx%’; from User user where (user.age%2)=1; from User user where user.age=20 and user.name like ‘%zx%’;
12. 实体的更新和删除 Hibernate3 中对更新和删除提供灵活和更具效率的解决办法 类似的方式来完成 delete 操作 Transaction trans=session.beginTransaction(); String hql=”update User user set user.age=20 where user.age=18”; Query queryupdate=session.createQuery(hql); int ret=queryupdate.executeUpdate(); trans.commit(); Transaction trans=session.beginTransaction(); String hql=”delete from User user where user.age=18”; Query queryupdate=session.createQuery(hql); int ret=queryupdate.executeUpdate(); trans.commit();
13. 属性查询 当只需要检索实体对象的部分属性所对应的数据 时 也可以一次检索多个属性 实例化查询 ( 动态构造实例 ) List list=session.createQuery(“select user.name from User user ”).list(); List list=session.createQuery(“select user.name,user.age from User user ”).list(); List list=session.createQuery(“select new User(user.name,user.age) from User user ”).list(); 注意,这时所返回的 User 对象,仅仅只是一个普通的 Java 对象而以,除了查询结果值之外,其它的属性值都为 null (包括主键值 id ),也就是说不能通过 Session 对象对此对象执行持久化的更新操作 , 只能 save()
14. 分组与排序 Order by 子句 , 可以通过 asc 或者 desc 关键字指定排序方式 , 默认的排序方式为 asc Group by 子句与统计查询 标准的 SQL 聚集函数都可以在 HQL 语句中使用,比如: count(),sum(),max(),min(),avg() 等 from User user order by user.name asc,user.age desc; String hql=”select count(user),user.age from User user group by user.age having count(user)>10 ”; List list=session.createQuery(hql).list();
15. 优化统计查询 from Customer c inner join c.orders o group by c.age;(1) select c.ID,c.name,c.age,o.ID,o.order_number,o.customer_ID from Customer c inner join c.orders o group by c.age;(2) 语句( 1 )检索的结果会返回 Customer 与 Order 持久化对象,而且它们会被置于 Hibernate 的 Session 缓存之中 , 只有事务提交后它们才会从缓存中被清除 语句( 2 )返回的是关系数据而并非是持久化对象,因此它们不会占用 Hibernate 的 Session 缓存,只要在检索之后应用程序不在访问它们,它们所占用的内存就有可能被 JVM 的垃圾回收器回收,而且 Hibernate 不会同步对它们的修改 尽量使用通过 select 语句写出需要查询的属性的方式来返回关系数据 , 而避免使用第一种查询方式返回持久化对象(这种方式是在有修改需求时使用比较适合),这样可以提高运行效率并且减少内存消耗 name varchar2(20) age number(10) ID varchar2(14) customer customer_ID varchar2(14) order_number number(10) ID varchar2(14) order
16. 参数绑定 传统 JDBC 的参数绑定 PrepareStatement pre=connection.prepare(“select * from User where user.name=?”); pre.setString(1,”zhao”); ResultSet rs=pre.executeQuery();
17. 参数绑定 在 Hibernate 中共存在 4 种参数绑定的方式 按参数名称绑定 , 在语句中定义命名参数要用” :” 开头 按参数位置邦定 Query query=session.createQuery(“from User user where user.name=:customername and user.age=:customerage”); query.setString(“customername”,name); query.setInteger(“customerage”,age); Query query=session.createQuery(“from User user where user.name=? and user.age =? ”); query.setString(0,name); query.setInteger(1,age);
18. 参数绑定 HQL 查询中可以通过 setParameter() 方法邦定任意类型的参数 可以用 query.setParameter(“customername”,name); 但是对于一些类型就必须写明映射类型,比如 java.util.Date 类型,因为它会对应 Hibernate 的多种映射类型 . 比如 Hibernate.DATA 或者 Hibernate.TIMESTAMP String hql=”from User user where user.name=:customername ”; Query query=session.createQuery(hql); query.setParameter(“customername”,name,Hibernate.STRING);
19. 参数绑定 使用 setProperties() 方法,将命名参数与一个对象的属性值绑定在一起 setProperties() 方法会自动将 customer 对象实例的属性值匹配到命名参数上,但是要求命名参数名称必须要与实体对象相应的属性同名 Customer customer=new Customer(); customer.setName(“pansl”); customer.setAge(80); Query query=session.createQuery(“from Customer c where c.name=:name and c.age=:age ”); query.setProperties(customer);