一:Hibernate检索方式
1.HQL检索方式
使用面向对象的HQL查询语言进行查询
示例:
public class Test { public static void main(String[] args) { //findOrder(); //findOrder2(); //findOrder3(); //findUserByPage(2, 3); findAllUsers(); HibernateUtil.closeFactory(); } /** * 查询订单数量大于0的所有用户 */ public static void findOrder() { Session session=HibernateUtil.openSession(); String hql="from User u where 0<(select count(o) from u.orders o)"; Query query=session.createQuery(hql); List<User> users=query.list(); for(User user:users) { System.out.println(user); } session.close(); } /** * 查询有订单的用户(使用in关键字) */ public static void findOrder2() { Session session=HibernateUtil.openSession(); String hql="from User u where u in(select o.user from Order o group by o.user)"; Query query=session.createQuery(hql); List<User> users=query.list(); for(User user:users) { System.out.println(user); } session.close(); } /** * 查询有订单的用户(使用函数) */ public static void findOrder3() { Session session=HibernateUtil.openSession(); String hql="from User u where size(u.orders)>0"; Query query=session.createQuery(hql); List<User> users=query.list(); for(User user:users) { System.out.println(user); } session.close(); } /** * hql进行分页查询 */ public static void findUserByPage(int pageNum,int pageSize) { Session session=HibernateUtil.openSession(); String hql="from User"; Query query=session.createQuery(hql); query.setFirstResult((pageNum-1)*pageSize);//每页的第一个数据 query.setMaxResults(pageSize);//每页的数量 List<User> users=query.list(); System.out.println(users); session.close(); } /** * hql的引用查询 */ public static void findAllUsers() { Session session=HibernateUtil.openSession(); Query query=session.createNamedQuery("findAllUsers", User.class); List list=query.list(); System.out.println(list); session.close(); } }
2.QBC(Query By Criteria)查询
- QBC可以看做是传统SQL的对象化表示
- 主要由Criteria接口,Criterion接口,Restrictions类组成。
- 可以看做是对HQL的再一次封装
示例:
public class Test1 { public static void main(String[] args) { searchByQBC(); } //使用QBC进行检索 public static void searchByQBC() { Session session=HibernateUtil.openSession(); Criteria criteria=session.createCriteria(User.class); Criterion c1=Restrictions.eq("userName","张三"); criteria.add(c1); List<User> users=criteria.list(); System.out.println(users); } }
Restrictions中的参数:
3.本地SQL查询
根据数据库本身的查询,可以使用数据库自己的方言
测试:
public class Test3 { public static void main(String[] args) { searchUser(); } public static void searchUser() { Session session=HibernateUtil.openSession(); String sql="select * from user"; NativeQuery query=session.createNativeQuery(sql,User.class); List<User> users=query.list(); for(User user:users) { System.out.println(user); } session.close(); } }
二:Hibernate的检索策略
立即检索: 立即加载检索方法指定的对象。
- 加载多余需要的对象白白浪费内存空间。
- select 语句数量多,频繁访问数据库,影响系统性能。
延迟检索: 延迟加载检索方法指定的对象。
- 避免多加载应用程序不需要访问的数据对象。
迫切左外连接检索: 利用SQL外连接查询功能加载检索方法指定对象。
- 减少执行select语句的数量,减少数据库访问,提高系统性能。
类级别的检索策略:Hibernate检索方法指定的检索对象(User)的检索策略;
关联级别的检索策略:与检索方法指定的检索对象相关的对象(Order)的检索策略。
应用:
public class Test2 { public static void main(String[] args) { //search(); search1(); } /** * Hibernate类级别的立即检索和延迟检索 */ public static void search() { Session session=HibernateUtil.openSession(); //User user=session.get(User.class, new Integer(1));//类级别的立即检索,会执行SQL语句 User user=session.load(User.class,new Integer(4));//类级别的延迟检索,当使用这个对象时才会执行sql语句,只是会创建Oid属性 Hibernate.initialize(user);//这个方法也会初始化对象 //System.out.println(user.getPassWord()); System.out.println(user); session.close(); } /* * 默认情况下多对一和一对一的检索方式 */ public static void search1() { Session session=HibernateUtil.openSession(); Order order=session.get (Order.class,new Integer(1)); System.out.println(order); session.close(); } }
类级别和关联级别可选的检索策略:
配置方式:在class中添加lazy属性,true表示延迟检索
lazy="true"
关联级别检索策略一对多和多对多:
关联级别检索策略多对一: