学习日志——2019/08/22

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44757417/article/details/100024472

Hibernate的查询的方式

  • 在Hibernate中提供了很多种的查询的方式。Hibernate共提供了五种查询方式。

Hibernate的查询方式:OID查询

  • OID检索:Hibernate根据对象的OID(主键)进行检索
使用get方法
Customer customer = session.get(Customer.class,1l);
使用load方法
Customer customer = session.load(Customer.class,1l);

Hibernate的查询方式:对象导航检索

  • 对象导航检索:Hibernate根据一个已经查询到的对象,获得其关联的对象的一种查询方式。
LinkMan linkMan = session.get(LinkMan.class,1l);
Customer customer  = linkMan.getCustomer();

Customer customer = session.get(Customer.class,2l);
Set<LinkMan> linkMans = customer.getLinkMans();

Hibernate的查询方式:HQL检索(*****)

  • HQL查询:Hibernate Query Language,Hibernate的查询语言,是一种面向对象的方式的查询语言,语法类似SQL。通过session.createQuery(),用于接收一个HQL进行查询方式。
初始化一些数据
@Test
	/**
	 * 初始化数据
	 */
	public void demo01() {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		//创建一个客户
		Customer customer = new Customer();
		customer.setCust_name("张三");
		
		//创建联系人
		for (int i = 1; i <= 10; i++) {
			LinkMan linkMan = new LinkMan();
			linkMan.setLkm_name("李四"+i);
			
			customer.getLinkMans().add(linkMan);
			linkMan.setCustomer(customer);
			
			session.save(linkMan);
		}
		session.save(customer);
		
		tx.commit();
	}
HQL的简单查询
@Test
	/**
	 * HQL的简单查询
	 */
	public void demo02() {
		Session session=HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		//简单的查询
		Query query =  session.createQuery("from Customer");
		List<Customer> list = query.list();	
		
		//sql中支持*的写法:select * from cst_customer;但是在HQL中不支持* 号的写法
		/*
		 * Query query=session.createQuery("select * from Customer");//报错
		 */
		for (Customer customer : list) {
			System.out.println(customer);
		}
		
		tx.commit();
	}
HQL的别名查询
@Test
	/**
	 * * 别名查询
	 */
	public void demo03() {
		Session session=HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		//别名查询
		/*
		 * Query query = session.createQuery("from Customer c"); List<Customer> list =
		 * query.list();
		 */
		
		Query query= session.createQuery("select c from Customer c");
		List<Customer> list =query.list();
		
		for (Customer customer : list) {
			System.out.println(customer);
		}
		
		tx.commit();
	}
HQL的排序查询
@Test
	/**
	 * * 排序查询
	 */
	public void demo04() {
		Session session=HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		//排序查询
		//默认情况
		//List<Customer> list = session.createQuery("from Customer order by cust_id").list();
		//升序使用asc	降序使用desc
		List<Customer> list = session.createQuery("from Customer order by cust_id desc").list();
		
		for (Customer customer : list) {
			System.out.println(customer);
		}
		
		tx.commit();
	}
HQL的条件查询
@Test
	/**
	 * *条件查询
	 */
	public void demo05() {
		Session session=HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		//条件查询
		//一、按位置绑定:按参数的位置进行绑定
		//一个条件
		/*
		 * Query query = session.createQuery("from Customer where cust_name=?");
		 * query.setParameter(0, "张三"); List<Customer> list =query.list();
		 */
		
		//多个条件
//		Query query = session.createQuery("from Customer where cust_name=? and cust_source like ?");
//		
//		query.setParameter(0, "张%"); 
//		query.setParameter(1, "网络推广");
//		List<Customer> list =query.list();
		//二、按名称绑定
		Query query = session.createQuery("from Customer where cust_source= :aaa and cust_name like :bbb");
		//设置参数:
		query.setParameter("aaa", "朋友推荐");
		query.setParameter("bbb", "王%");
		List<Customer> list = query.list();
		
		
		for (Customer customer : list) {
			System.out.println(customer);
		}
		
		tx.commit();
	}
HQL的投影查询
  • 投影查询:查询对象的某个或某些属性。
@Test
	/**
	 * 投影查询
	 */
	public void demo06() {
		Session session=HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		//投影查询
		//单个属性
//		List<Object> list = session.createQuery("select c.cust_name from Customer c").list();
//		for (Object object : list) {
//			System.out.println(object);
//		}
		//多个属性
//		
		//查询多个属性,但是我想封装到对象中
		List<Customer> list = session.createQuery("select new Customer(cust_name,cust_source)from Customer").list();
		for (Customer customer : list) {
			System.out.println(customer);
		}
		
		tx.commit();
	}
	
HQL的分页查询
@Test
	/**
	 * 分页查询
	 */
	public void demo07() {
		Session session=HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		//分页查询
		Query query = session.createQuery("from LinkMan");
		query.setFirstResult(0);
		query.setMaxResults(10);
		List<LinkMan> list = query.list();
		
		for (LinkMan linkMan : list) {
			System.out.println(linkMan);
		}
		
		tx.commit();
	}
HQL的分组查询
@Test
	/*
	 * 分组查询
	 */
	public void demo08() {
		Session session=HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		//聚合函数的使用:count(),max(),min(),avg(),sum()
		Object object = session.createQuery("select count(*) from Customer").uniqueResult();
		System.out.println();
		//分组统计
		List<Object[]> list = session.createQuery("select cust_source,count(*) from Customer group by cust_source").list();
		
		for (Object[] objects : list) {
			System.out.println(Arrays.toString(objects));
		}
		
		tx.commit();
	}
HQL的多表查询
  • SQL 的多表查询
    • 连接查询
      • 交叉连接(一般不用):笛卡尔积
        • select from A,B
      • 内连接(查的是公共部分):inner join (inner 可以省略)
        • 隐式内连接:select * from A,B where Aid=B.aid;
        • 显示内连接:select * from A inner join B on A_id=B.aid;
      • 外连接
        • 左外连接(左+公共部分):left outer join(outer可以省略)
          • select * from A left outer join B on A.id=B.aid;
        • 右外连接(右+公共部分):right outer join(outer可以省略)
          • select * from A left outer join B on A.id=B.aid;
    • 子查询
  • HQL的多表查询
    • 连接查询
      • 交叉连接

      • 内连接(内连接时封装成Object 数组)

        • 显示内连接
        • 隐式内连接
        • 迫切内连接(迫切内连接是装到对象中)
      • 外连接

        • 左外连接
        • 右外连接
        • 迫切左外连接
@Test
	/**
	 * HQL的多表查询
	 */
	public void demo09() {
		Session session=HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
//		
//		//HQL:内连接from Customer c inner join c.linkMans
//		List<Object[]> list = session.createQuery("from Customer c inner join c.linkMans").list();
//		for (Object[] objects : list) {
//			System.out.println(objects);
//		}
		//HQL:迫切内连接 其实就是在普通的内连接inner join后添加一个关键字fetch.
		//distict去掉重复对象
		List<Customer> list=session.createQuery("select distinct c from Customer c inner join fetch c.linkMans").list();//fetch 通知hibernate,将另一个对象的数据封装到该对象中
		
		for (Customer customer : list) {
			System.out.println(customer);
		}
		
		tx.commit();
	}

猜你喜欢

转载自blog.csdn.net/weixin_44757417/article/details/100024472