Hibernate框架(四)

1 HQL查询

(1)基本查询,排序查询,条件查询,分页查询,统计查询,投影查询

package cn.itcast.a_hql;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import cn.itcast.domain.Customer;
import cn.itcast.utils.HibernateUtils;

//学习 HQL 语法
public class Demo {
	// 基本语法
	@Test
	public void fun1() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		// -------------------------------
		String hql = "from cn.itcast.domain.Customer";// 完整写法
		String hql2 = "from Customer";// 简洁写法
		String hql3 = "from java.lang.Object";

		Query query = session.createQuery(hql2);
		List list = query.list();

		System.out.println(list);
		// -------------------------------
		tx.commit();
		session.close();
	}

	// 排序
	@Test
	public void fun2() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		// -------------------------------
		String hql1 = "from cn.itcast.domain.Customer order by cust_id asc";// 完整写法
		String hql2 = "from cn.itcast.domain.Customer order by cust_id desc";
		Query query = session.createQuery(hql1);
		List list = query.list();

		System.out.println(list);
		// -------------------------------
		tx.commit();
		session.close();
	}

	// 条件检索
	@Test
	public void fun3() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		// -------------------------------
		String hql1 = "from cn.itcast.domain.Customer where cust_id=?";// 完整写法
		String hql2 = "from cn.itcast.domain.Customer where cust_id= :id";
		Query query = session.createQuery(hql1);
		query.setParameter(0, 2l);
		// query.setParameter("id", 2l);
		List list = query.list();
		System.out.println(list);
		// -------------------------------
		tx.commit();
		session.close();
	}

	// 分页查询
	@Test
	public void fun4() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		// -------------------------------
		String hql1 = "from cn.itcast.domain.Customer";// 完整写法
		Query query = session.createQuery(hql1);

		query.setFirstResult(0);
		query.setMaxResults(2);

		List list = query.list();
		System.out.println(list);
		// -------------------------------
		tx.commit();
		session.close();
	}

	// 统计查询 指的就是聚合函数
	/*
	 * count sum avg max min
	 */
	@Test
	public void fun5() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		// -------------------------------
		String hql1 = "select count(*) from cn.itcast.domain.Customer";
		String hql2 = "select sum(cust_id) from cn.itcast.domain.Customer";
		String hql3 = "select avg(cust_id) from cn.itcast.domain.Customer";
		String hql4 = "select max(cust_id) from cn.itcast.domain.Customer";
		String hql5 = "select min(cust_id) from cn.itcast.domain.Customer";
		Query query = session.createQuery(hql3);
		Number number = (Number) query.uniqueResult();
		System.out.println(number);
		// -------------------------------
		tx.commit();
		session.close();
	}

	// 投影查询
	/*
	 * 查询对象的某一些属性,看到塔的一部分
	 */
	@Test
	public void fun6() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		// -------------------------------
		String hql1 = "select cust_name from cn.itcast.domain.Customer";
		String hql2 = "select cust_name,cust_id from cn.itcast.domain.Customer";
		String hql3 = "select new Customer(cust_id,cust_name) from cn.itcast.domain.Customer";
		Query query = session.createQuery(hql3);
		//List list = query.list();
		List list = query.list();
		System.out.println(list);
		// -------------------------------
		tx.commit();
		session.close();
	}
}

(2)多表查询

package cn.itcast.a_hql;

import java.util.Arrays;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import cn.itcast.domain.Customer;
import cn.itcast.utils.HibernateUtils;

//学习 HQL 语法-----多表查询
public class Demo2 {
	// 回顾原生SQL
	// 交叉连接----笛卡儿积(避免) select * from A,B

	// 内连接,分为隐式内连接和显式内连接 select * from A,B where b.aid=a.id; 
	//	select * from A inner join B on b.aid=a.id

	// 外连接,分为左外连接和右外连接
	//select * from A left [outer] join B on b.aid=a.id
	//select * from A right [outer] join B on b.aid=a.id
	/*
	 * 内连接
	 */
	@Test
	public void fun1() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		// --------------------------------------------
		String hql = "from Customer c inner join c.linkMans";
		Query query = session.createQuery(hql);
		List list = query.list();
		for (Object[] arr : list) {
			System.out.println(Arrays.toString(arr));
		}
		// --------------------------------------------
		tx.commit();
	}

	/*
	 * 迫切内连接
	 * 
	 */
	@Test
	public void fun2() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		// --------------------------------------------
		String hql = "from Customer c inner join fetch c.linkMans";
		Query query = session.createQuery(hql);
		List list = query.list();
		System.out.println(list);
		// --------------------------------------------
		tx.commit();
	}
}

2 CRITERIA查询

(1)基本查询,排序查询,条件查询,分页查询,统计查询,投影查询

package cn.itcast.b_criteria;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;

import cn.itcast.domain.Customer;
import cn.itcast.utils.HibernateUtils;

//学习Criteria语法
public class Demo {

	//基本查询
	@Test
	public void fun1() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//-----------------------------------------
		Criteria criteria = session.createCriteria(Customer.class);
		List list = criteria.list();
		System.out.println(list);
		//-----------------------------------------
		tx.commit();
		session.close();
	}
	
	//条件查询
	@Test
	public void fun2() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		// -----------------------------------------
		Criteria criteria = session.createCriteria(Customer.class);
		// criteria.add(Restrictions.idEq(2l));
		criteria.add(Restrictions.eq("cust_id", 2l));
		List list = criteria.list();
		System.out.println(list);
		// -----------------------------------------
		tx.commit();
		session.close();
	}
		
		
	// 分页查询
	@Test
	public void fun3() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		// -----------------------------------------
		Criteria c = session.createCriteria(Customer.class);
		c.setFirstResult(0);
		c.setMaxResults(2);
		List list = c.list();
		System.out.println(list);
		// -----------------------------------------
		tx.commit();
		session.close();
	}
	// 排序查询
	@Test
	public void fun4() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		// -----------------------------------------
		Criteria c = session.createCriteria(Customer.class);
		
		c.addOrder(Order.asc("cust_id"));
		//c.addOrder(Order.desc("cust_id"));
		
		List list = c.list();
		System.out.println(list);
		// -----------------------------------------
		tx.commit();
		session.close();
	}

	// 统计查询
	@Test
	public void fun5() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		// -----------------------------------------
		Criteria c = session.createCriteria(Customer.class);
		
		c.setProjection(Projections.rowCount());
		
		List list = c.list();
		System.out.println(list);
		// -----------------------------------------
		tx.commit();
		session.close();
	}
}

(2)离线criteria查询

package cn.itcast.b_criteria;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;

import cn.itcast.domain.Customer;
import cn.itcast.utils.HibernateUtils;

//学习离线Criteria
public class Demo2 {
	@Test
	public void fun1() {
		//service层或者web层
		DetachedCriteria dc = DetachedCriteria.forClass(Customer.class);
		dc.add(Restrictions.idEq(3l));
		
		//dao层
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		
		Criteria c = dc.getExecutableCriteria(session);
		List list = c.list();
		System.out.println(list);
		
		tx.commit();
		session.close();
	}
}

3 懒加载|延迟加载

package cn.itcast.c_lazy;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import cn.itcast.domain.Customer;
import cn.itcast.utils.HibernateUtils;

//懒加载|延迟加载
public class Demo {
	@Test
	//get方法:立即加载,执行方法时立即发送sql语句查询结果
	public void fun1() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//-------------------------------------------
		Customer c = session.get(Customer.class, 2l);
		System.out.println(c);
		//-------------------------------------------
		tx.commit();
		session.close();
	}
	
	@Test
	//load方法(默认):是在执行中,不发送sql语句,返回一个对象,调用该对象时,才执行查询
	public void fun2() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//-------------------------------------------
		Customer c = session.load(Customer.class, 2l);
		System.out.println(c);
		//-------------------------------------------
		tx.commit();
		session.close();
	}
}
懒加载即延迟加载的意思就是在使用时再加载资源,当不使用时就不会加载。


4 关联级别延迟加载

package cn.itcast.d_lazy_fetch;

import java.util.List;
import java.util.Set;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import cn.itcast.domain.Customer;
import cn.itcast.domain.LinkMan;
import cn.itcast.utils.HibernateUtils;

//关联级别延迟加载 & 抓取策略
public class Demo {
	@Test
	//fetch:select	单表查询	lazy:true 懒加载
	//做实验时记得更改配置
	public void fun1() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//-------------------------------------------
		Customer c = session.get(Customer.class, 2l);
		Set linkMans = c.getLinkMans();//关联级别
		System.out.println(linkMans);
		//-------------------------------------------
		tx.commit();
		session.close();
	}
	
	@Test
	//fetch:select	单表查询	lazy:false 立即加载 
	public void fun2() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//-------------------------------------------
		Customer c = session.get(Customer.class, 2l);
		Set linkMans = c.getLinkMans();//关联级别
		System.out.println(linkMans);
		//-------------------------------------------
		tx.commit();
		session.close();
	}
	
	
	@Test
	//fetch:select	单表查询	lazy:extra 及其懒惰 
	public void fun3() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//-------------------------------------------
		Customer c = session.get(Customer.class, 2l);
		Set linkMans = c.getLinkMans();//关联级别
		System.out.println(linkMans);
		//-------------------------------------------
		tx.commit();
		session.close();
	}
	
	@Test
	//fetch:join	多表查询	lazy失效 永远立即加载
	public void fun4() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//-------------------------------------------
		Customer c = session.get(Customer.class, 2l);
		Set linkMans = c.getLinkMans();//关联级别
		System.out.println(linkMans);
		//-------------------------------------------
		tx.commit();
		session.close();
	}
	
	@Test
	//fetch:subselect	子查询	lazy:true
	public void fun5() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//-------------------------------------------
		String hql = "from Customer";
		Query query = session.createQuery(hql);
		List list = query.list();
		for(Customer c : list) {
			System.out.println(c);
			System.out.println(c.getLinkMans().size());
			System.out.println(c.getLinkMans());
		}
		//-------------------------------------------
		tx.commit();
		session.close();
	}
}


你可能感兴趣的:(Hibernate框架(四))