《Hibernate上课笔记》-----class8----Hibernate的检索方式和检索策略

一: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"

关联级别检索策略一对多和多对多:
在这里插入图片描述
关联级别检索策略多对一:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44867340/article/details/115317836