Hibernate中的用hql语句完成查询,以及hibernate当中的三种缓存方式的不同和用法

本文介绍了Hibernate的一级、二级和查询缓存。一级缓存为session缓存,仅对象缓存,不适用于集合。二级缓存需手动开启并配置Ehcache或Redis,为session仓库级缓存,同样不支持集合缓存。查询缓存则缓存当前查询结果的对象。
//查询持久化数据
Users users = session.get(Users.class, 2);
System.out.println(users.getUname());
//查询users表中的所有数据
String hql="select u from Users u";
	Query query = session.createQuery(hql);
	List<Users> list = query.list();
		for (Users users : list) {
		System.out.println(users.getUname());
	}
//查询非持久态数据查询某个特定的内容
		String hql="select u.uid,u.uname from Users u";
		Query query = session.createQuery(hql);
		//用一个数组类的list集合来接收
		List<Object[]> list = query.list();
		for (Object[] objects : list) {
			System.out.println(objects[0]+"\t"+objects[1]);
		}
//查询持久态的数据要求要有相对应得构造方法用new 对象来接收
		String hql="select new Users(u.uid,u.uname) from Users u";
		Query query = session.createQuery(hql);
		List<Users> list = query.list();
		for (Users users : list) {
			System.out.println(users.getUname()+"\t"+users.getUid());
		}
//修改
	String hql="update Users u set u.uname='哈哈'";
	Query query = session.createQuery(hql);
	int row = query.executeUpdate();
	System.out.println(row);
	//删除
		String hql="delete from Users u where u.uname like '%哈%'";
		Query query = session.createQuery(hql);
		int row = query.executeUpdate();
		System.out.println(row);
//		查询函数
		String hql="select count(p.pid) from Product p";
		Query query = session.createQuery(hql);
		//获取唯一的结果
		long i = (Long) query.uniqueResult();
		System.out.println(i);


		String hql="select max(p.pid) from Product p";
		Query query = session.createQuery(hql);
		Integer  max = (Integer) query.uniqueResult();
		System.out.println(max);
//占位符的使用
		String hql="select p from Product p where p.pname like ?0";
		Query query = session.createQuery(hql).setParameter(0, "%奥%");
		List<Product> list = query.list();
		for (Product product : list) {
			System.out.println(product.getPname());
		}
	//指定占位符的方式
		String hql="select p from Product p where p.pname like:pname";
		Query query = session.createQuery(hql).setParameter("pname", "%奥%");
		List<Product> list = query.list();
		for (Product product : list) {
			System.out.println(product.getPname());
		}
//集合的方式
		String hql="delete from Product p where p.pid in :fw";
		List<Integer> list=new ArrayList<Integer>();
		list.add(5);
		list.add(6);
				//集合值
		Query query = session.createQuery(hql).setParameterList("fw", list);
		int i = query.executeUpdate();
		System.out.println(i);
//分页查询
		String hql="select p from Product p";
		int pagenum=1;
		int pagesize=4;
		Query query = session.createQuery(hql)
				//获取最大位置的结果值
		.setMaxResults(pagesize)
		       //获取第一个位置的值
		.setFirstResult((pagenum-1)*pagenum);
		List<Product> list = query.list();
		for (Product product : list) {
			System.out.println(product.getPname());
		}
//查询用户名称带d的所有商品
		String hql="select p from Product p left join Users u on p.users.uid=u.uid where u.uname like:uname ";
		Query query = session.createQuery(hql)
		.setParameter("uname", "%d%");
		List<Product> list = query.list();
		for (Product product : list) {
			System.out.println(product.getPname());
		}
//查询买了商品的用户
		String hql="select u from Users u where u.products.size>0";
		Query query = session.createQuery(hql);
		List<Users> list = query.list();
		for (Users users : list) {
			System.out.println(users.getUname());
		}
//查询买了商品带h的所有用户
		String hql="select u from Users u where u.uid in(select p.users.uid from Product p where p.pname like:pname)";
		Query query = session.createQuery(hql).setParameter("pname", "%h%");
		List<Object> list = query.list();
		for (Object object : list) {
			Users users=(Users)object;
			System.out.println(users.getUname());
		}

对于hibernate当中的三种缓存
一级缓存:session缓存,不缓存集合

//用相同的代码,他会只查询一次,结果出现两次
Users users = session.get(Users.class, 10);
		System.out.println(users.getUname());
		Users users1 = session.get(Users.class, 10);
		System.out.println(users1.getUname());

一级缓存所达到的效果图
接下来我们把session关闭来看一下会是什么结果

Users users = session.get(Users.class, 10);
		System.out.println(users.getUname());
		session.close();
		session=factory.openSession();
		Users users1 = session.get(Users.class, 10);
		System.out.println(users1.getUname());

也就是说只要session关则一级缓存不再生效

我们接下来再来看一下对于集合来说一级缓存有没有用
写两个相同的list集合来查询看看一级缓存是否能缓存

List<Users> list = session.createQuery("select u from Users u").list();
		for (Users users : list) {
			System.out.println(users.getUname());
		}
		List<Users> list1 = session.createQuery("select u from Users u").list();
		for (Users users : list1) {
			System.out.println(users.getUname());
		}

我们会发现它也是同样查询了两次和出现了两次结果
因此得到的结论便是一级查询只针对于session查询,是一个对象缓存,不能缓存集合

二级查询 是一个session仓库缓存
只不过要想完成二级缓存首先要去hibernate文件当中去打开二级缓存然后需要自己配置 需要Ehcache (后期工作使用redis)因为二级缓存在hibernate当中不是默认存在的需要自己去打开
先在pom.xml当中去配置二级缓存组件

再打开和指定二级缓存使用的类

然后再重复以上查询动作看会有什么不同的结果

//把session关闭看会不会与一级缓存不同之处
Users users = session.get(Users.class, 10);
		System.out.println(users.getUname());
		session.close();
		session = factory.openSession();
    	Users users1 = session.get(Users.class, 10);
		System.out.println(users1.getUname());

会发现当session关闭后重新打开session之后查询语句只出现了一次而结果不变因此二级缓存比一级缓存缓存范围要大一些

我们再来看一下集合

List<Users> list = session.createQuery("select u from Users u").list();
		for (Users users : list) {
			System.out.println(users.getUname());
		}
		List<Users> list1 = session.createQuery("select u from Users u").list();
		for (Users users : list1) {
			System.out.println(users.getUname());
		}

会发现还是与一级缓存一样

因此得到的结论是二级缓存是session仓库级缓存,只能是对象缓存不能是集合缓存

最后一个便是查询缓存了
查询缓存了:缓存的是当前对象的缓存

首先要在hibernate当中去打开查询缓存

		Query query = session.createQuery("from Users u where u.uid=10");
		//手动开启查询缓存
		query.setCacheable(true);
		Users a=(Users) query.uniqueResult();
		System.out.println(a.getUname());
		System.out.println("-------------------------------");
		Query query1 = session.createQuery("from Users u where u.uid=10");
		//手动开启查询缓存
		query1.setCacheable(true);
		Users a1=(Users) query1.uniqueResult();
		System.out.println(a1.getUname());

同样会发现查询了一次但结果依然是两次,因此说明查询缓存在这打开了作用

Query query1=session.createQuery("from Users");
		query1.setCacheable(true);
		List<Users> list=query1.list();
		for (Users a : list) {
			System.out.println(a.getUname());
		}
		
		Query query2=session.createQuery("from Users");
		query2.setCacheable(true);
		List<Users> list1=query2.list();
		for (Users a : list1) {
			System.out.println(a.getUname());
		}

这时候我们会发现原本一级查询和二级查询对集合不起缓存作用的没想到在查询缓存下得到了缓存

因此得到了一个结论就是
查询缓存缓存的是当前对象的缓存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值