Hibernate学习笔记(五)

                                      Hibernate的五种查询方式

                              目录                                  

 Hibernate的查询方式一:OID查询

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

 Hibernate的查询方式三:HQL检索(重点)

           1、简单查询   2、排序查询  3、条件查询  4、投影查询  5、分页查询  6、分组统计查询  7、多表查询

 Hibernate的查询方式四:QBC检索(重点)

            1、简单查询   2、排序查询  3、分页查询  4 、条件查询  5 、统计查询 6 、离线条件查询

 Hibernate的查询方式五:SQL检索


 Hibernate的查询方式一:OID查询

 OID检索:Hibernate根据对象的OID(主键)进行检索

 (1) 、使用get方法 :

Customer customer = session.get(Customer.class,1l); //第二个参数 1表示对象OID为 1,l表示OID为  Long类型

 (2) 、使用load方法 :

Customer customer = session.load(Customer.class,1l);

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

对象导航检索:Hibernate根据一个已经查询到的对象,获得其关联的对象的一种查询方式。

LinkMan linkMan = session.get(LinkMan.class,1l);
Customer customer  = linkMan.getCustomer();   //获取关联对象

 Hibernate的查询方式三:HQL检索(重点)

HQL查询:Hibernate Query Language,Hibernate的查询语言,是一种面向对象的方式的查询语言,语法类似SQL。通过session.createQuery(),用于接收一个HQL进行查询方式。

初始化数据 :通过更改姓名,多次执行程序,创建多个客户及多个联系人

package czm.hibernate.testdemo;

import java.util.List;

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

import czm.hibernate.domain.Customer;
import czm.hibernate.domain.LinkMan;
import czm.hibernate.utils.HibernateUtils;



public class TestDemo {
        @Test
	/**
	 * 初始化数据
	 */
	public void testdemo1() {
		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);
			linkMan.setCustomer(customer);

			customer.getLinkMans().add(linkMan);

			session.save(linkMan);
		}
		session.save(customer);

		tx.commit();
	}
}

客户表3条数据:

 

 联系人表对应30条数据:

利用HQL可做7种查询 :

1、简单查询   2、排序查询  3、条件查询  4、投影查询  5、分页查询  6、分组统计查询  7、多表查询

 (1)、HQL的简单查询

package czm.hibernate.testdemo;

import java.util.List;

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

import czm.hibernate.domain.Customer;
import czm.hibernate.domain.LinkMan;
import czm.hibernate.utils.HibernateUtils;



public class TestDemo {

	@Test
	/**
	 * HQL的简单查询
	 */
	public void testdemo02(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		//简单查询
              //Customer指实体类,完整写法为包+类名称,,但因为有配置文件,包名称可省略不写,只写类名
		Query query = session.createQuery("from Customer");  
		List<Customer> list = query.list();
		
		for (Customer customer : list) {
		  System.out.println(customer); //打印输出查询结果
		}
		
		tx.commit();
		
	}
	
}

程序运行结果 : 

 (2)、HQL的排序查询

package czm.hibernate.testdemo;

import java.util.List;

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

import czm.hibernate.domain.Customer;
import czm.hibernate.domain.LinkMan;
import czm.hibernate.utils.HibernateUtils;



public class TestDemo {

	@Test
	/**
	 * HQL的排序查询
	 */
	public void testdemo03(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		//排序查询   升序 :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();
		
	}
	
}

程序运行结果 : 

(3)、HQL的条件查询(3种情况

在数据库表cst_customer中的cust_source字段加入几个参数以供查询

一个条件查询 :

package czm.hibernate.testdemo;

import java.util.List;

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

import czm.hibernate.domain.Customer;
import czm.hibernate.domain.LinkMan;
import czm.hibernate.utils.HibernateUtils;



public class TestDemo {
		
	@Test
	/**
	 * HQL的条件查询
	 */
	public void testdemo04(){
		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();
		 
		
		for (Customer customer : list) {
			System.out.println(customer);
		}
		
		tx.commit();
		
	}
}

 程序运行结果 :

多个条件查询 :

package czm.hibernate.testdemo;

import java.util.List;

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

import czm.hibernate.domain.Customer;
import czm.hibernate.domain.LinkMan;
import czm.hibernate.utils.HibernateUtils;



public class TestDemo {
		
	@Test
	/**
	 * HQL的条件查询
	 */
	public void testdemo04(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		// 条件的查询
		// 一、按位置绑定:根据参数的位置进行绑定。
		 
		// 多个条件
		
		 Query query = session.createQuery("from Customer where cust_source = ? and cust_name like ?");
		 query.setParameter(0, "程序员"); query.setParameter(1, "李%");
		 List<Customer> list = query.list();
		 		
		for (Customer customer : list) {
			System.out.println(customer);
		}
		
		tx.commit();
		
	}
}

 程序运行结果 :

名称绑定查询 :

package czm.hibernate.testdemo;

import java.util.List;

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

import czm.hibernate.domain.Customer;
import czm.hibernate.domain.LinkMan;
import czm.hibernate.utils.HibernateUtils;



public class TestDemo {
		
	@Test
	/**
	 * HQL的条件查询
	 */
	public void testdemo04(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		// 条件的查询
		 
		// 二、按名称绑定
		Query query = session.createQuery("from Customer where cust_source = :a and cust_name like :b");  //a 和 b 为自定义名称 ,冒号和名称之间不能有空格之类的
		// 设置参数:
		query.setParameter("a", "博士生");
		query.setParameter("b", "王%");
		List<Customer> list = query.list();
		
		for (Customer customer : list) {
			System.out.println(customer);
		}
		
		tx.commit();
		
	}
}

程序运行结果 : 

(4)、HQL的投影查询 

投影查询:查询对象的某个或某些属性。

单个属性查询

package czm.hibernate.testdemo;

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 czm.hibernate.domain.Customer;
import czm.hibernate.domain.LinkMan;
import czm.hibernate.utils.HibernateUtils;



public class TestDemo {
		
	@Test
	/**
	 * 投影查询
	 */
	public void testdemo6() {
	    Session session = HibernateUtils.getCurrentSession();
	    Transaction tx = session.beginTransaction();
		// 投影查询
		// 单个属性		
           List<Object> list = session.createQuery("select cust_name from Customer").list(); 
           for (Object object :list) {
            System.out.println(object); }		 
		
           tx.commit();
	}
	
	
	
}

程序运行结果 :  

多个属性查询 

package czm.hibernate.testdemo;

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 czm.hibernate.domain.Customer;
import czm.hibernate.domain.LinkMan;
import czm.hibernate.utils.HibernateUtils;



public class TestDemo {
		
	@Test
	/**
	 * 投影查询
	 */
	public void testdemo6() {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();

		// 投影查询
		// 多个属性:
		
     	  List<Object[]> list = session.createQuery("select cust_name,cust_source from Customer").list(); 
             for(Object[] objects : list) {
		    System.out.println(Arrays.toString(objects)); }
		 
		  tx.commit();
	}
	
	
	
}

程序运行结果 :  

多个属性封装成对象

首先在实体类Customer 中添加一个无参构造和一个有参构造方法,根据需要查询的属性个数决定有参构造方法中参数的个数

	//无参构造		
	public Customer() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	//含两个参数的构造方法			
	public Customer(String cust_name, String cust_source) {
		super();
		this.cust_name = cust_name;
		this.cust_source = cust_source;
	}

 编写查询 cust_name 和 cust_source 两个属性并将数据封装成对象的程序

package czm.hibernate.testdemo;

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 czm.hibernate.domain.Customer;
import czm.hibernate.domain.LinkMan;
import czm.hibernate.utils.HibernateUtils;



public class TestDemo {
		
	@Test
	/**
	 * 投影查询
	 */
	public void testdemo6() {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();

		// 投影查询		
		// 查询多个属性,封装到对象中。
		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();
	}
	
	
	
}

程序运行结果 :  

(5)、HQL的分页查询 

首先在实体类LinkMan中添加 toString方法 ,添加toString方法时去掉 customer对象属性,否则会造成死循环

	@Override
	public String toString() {
		return "LinkMan [lkm_id=" + lkm_id + ", lkm_name=" + lkm_name + ", lkm_gender=" + lkm_gender + ", lkm_phone="
				+ lkm_phone + ", lkm_mobile=" + lkm_mobile + ", lkm_email=" + lkm_email + ", lkm_qq=" + lkm_qq
				+ ", lkm_position=" + lkm_position + ", lkm_memo=" + lkm_memo + "]";
	}

 编写分页查询程序

package czm.hibernate.testdemo;

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 czm.hibernate.domain.Customer;
import czm.hibernate.domain.LinkMan;
import czm.hibernate.utils.HibernateUtils;



public class TestDemo {
   @Test
	/**
	 * 分页查询
	 */
	public void testdemo7() {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();

		// 分页查询
		Query query = session.createQuery("from LinkMan");
		//每页显示10条数据
		query.setFirstResult(0);
		query.setMaxResults(10);
		List<LinkMan> list = query.list();

		for (LinkMan linkMan : list) {
			System.out.println(linkMan);
		}
		tx.commit();
	}
	
}

 程序运行结果 :

(6)、HQL的分组统计查询

package czm.hibernate.testdemo;

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 czm.hibernate.domain.Customer;
import czm.hibernate.domain.LinkMan;
import czm.hibernate.utils.HibernateUtils;



public class TestDemo {
	@Test
	/**
	 * 分组统计查询
	 */
	public void testdemo8() {
		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(object);*/
		
		// 分组统计:
		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();
	}
	
}

 程序运行结果 : 

 

(7)、HQL的多表查询

 内连接 :将数据封装成Object数组

package testdemo02;

import java.util.Arrays;
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.Projections;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;

import czm.hibernate.domain.Customer;
import czm.hibernate.utils.HibernateUtils;

public class TestDemo02 {
	@Test
	/**
	 * HQL的多表查询
	 */
	public void testdemo9() {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		// SQL内连接语句:SELECT * FROM cst_customer c INNER JOIN cst_linkman l ON c.cust_id = l.lkm_cust_id;
		// HQL内连接语句:from Customer c inner join c.linkMans    //其中 c 为 自定义实体类Customer的别名
		  List<Object[]> list = session.createQuery("from Customer c inner join c.linkMans").list(); 
		  for (Object[] objects : list) { 
			  System.out.println(Arrays.toString(objects)); 
		  }
		 
		tx.commit();
	}
}

 程序运行结果 : 

迫切内连接 :将数据封装到对象中

在实体类Customer 添加toString方法 ,此查询方法需要把类中的LinkMan对象属性勾选上,其它查询方法在添加toString方法时均不勾选此属性

	@Override
	public String toString() {
		return "Customer [cust_id=" + cust_id + ", cust_name=" + cust_name + ", cust_source=" + cust_source
				+ ", cust_industry=" + cust_industry + ", cust_level=" + cust_level + ", cust_phone=" + cust_phone
				+ ", cust_mobile=" + cust_mobile + ", linkMans=" + linkMans + "]";
	}

 编写测试类

package testdemo02;

import java.util.Arrays;
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.Projections;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;

import czm.hibernate.domain.Customer;
import czm.hibernate.utils.HibernateUtils;

public class TestDemo02 {
	@Test
	/**
	 * HQL的多表查询
	 */
	public void testdemo9() {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		 
		// HQL:迫切内连接 其实就在普通的内连接inner join后添加一个关键字fetch. from Customer c inner join fetch c.linkMans
		List<Customer> list = session.createQuery("select distinct c from Customer c inner join fetch c.linkMans").list(); //通知hibernate,将另一个对象的数据封装到该对象中

		for (Customer customer : list) {
			System.out.println(customer);
		}
		tx.commit();
	}
}

  程序运行结果 : 

 Hibernate的查询方式四QBC检索(重点)

 QBC查询:Query By Criteria,条件查询。是一种更加面向对象化的查询的方式。

利用QBC可做7种查询 :

1、简单查询   2、排序查询  3、分页查询  4 、条件查询  5 、统计查询 6 、离线条件查询

(1)、QBC的简单查询

package testdemo02;

import java.util.List;

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

import czm.hibernate.domain.Customer;
import czm.hibernate.utils.HibernateUtils;

public class TestDemo02 {
	@Test
	/**
	 * 简单的查询
	 */
	public void testdemo1(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		// 获得Criteria的对象
		Criteria criteria = session.createCriteria(Customer.class);
		List<Customer> list = criteria.list();
		
		for (Customer customer : list) {
			System.out.println(customer);
		}
		tx.commit();
	}
}

程序运行结果 : 

(2)、QBC的排序查询

package testdemo02;

import java.util.List;

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

import czm.hibernate.domain.Customer;
import czm.hibernate.utils.HibernateUtils;

public class TestDemo02 {
	@Test
	/**
	 * 排序查询
	 */
	public void testdemo2(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		// 排序查询
		Criteria criteria = session.createCriteria(Customer.class);
	      //criteria.addOrder(Order.asc("cust_id")); // 升序
		criteria.addOrder(Order.desc("cust_id")); // 降序
		List<Customer> list = criteria.list();
		
		for (Customer customer : list) {
			System.out.println(customer);
		}
		
		tx.commit();
	}
}

 程序运行结果 :

(3)、QBC的分页查询

package testdemo02;

import java.util.List;

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

import czm.hibernate.domain.LinkMan;
import czm.hibernate.utils.HibernateUtils;

public class TestDemo02 {
	@Test
	/**
	 * 分页查询
	 */
	public void testdemo3(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		// 分页查询
		Criteria criteria = session.createCriteria(LinkMan.class);
		//每页显示10条数据
		criteria.setFirstResult(0);
		criteria.setMaxResults(10);
		List<LinkMan> list = criteria.list();
		
		for (LinkMan linkMan : list) {
			System.out.println(linkMan);
		}
		tx.commit();
	}
}

程序运行结果 :

(4)、QBC的条件查询

package testdemo02;

import java.util.List;

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

import czm.hibernate.domain.Customer;
import czm.hibernate.utils.HibernateUtils;

public class TestDemo02 {
	@Test
	/**
	 * 条件查询
	 */
	public void testdemo4(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		// 条件查询
		Criteria criteria = session.createCriteria(Customer.class);
		// 设置条件:
		/**
		 * =   eq
		 * >   gt
		 * >=  ge
		 * <   lt
		 * <=  le
		 * <>  ne  不等于
		 * like
		 * in
		 * and
		 * or
		 */
		criteria.add(Restrictions.eq("cust_source", "程序员"));		
		criteria.add(Restrictions.like("cust_name", "李%"));
		List<Customer> list = criteria.list();
		for (Customer customer : list) {
			System.out.println(customer);
		}
		tx.commit();
	}
}

程序运行结果 :

(5)、QBC的统计查询

package testdemo02;

import java.util.List;

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

import czm.hibernate.domain.Customer;
import czm.hibernate.utils.HibernateUtils;

public class TestDemo02 {
	@Test
	/**
	 * 统计查询
	 */
	public void testdemo5(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		Criteria criteria = session.createCriteria(Customer.class);
		/**
		 * add			:普通的条件。where后面条件
		 * addOrder		:排序
		 * setProjection	:聚合函数 和 group by 、 having
		 */
		criteria.setProjection(Projections.rowCount());
		Long num = (Long) criteria.uniqueResult();
		System.out.println(num);
		tx.commit();
	}
}

程序运行结果 :

(6)、QBC的离线条件查询

package testdemo02;

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.Projections;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;

import czm.hibernate.domain.Customer;
import czm.hibernate.utils.HibernateUtils;

public class TestDemo02 {
	@Test
	/**
	 * 离线条件查询
	 */
	public void testdemo6(){
		//创建对象
		DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
		detachedCriteria.add(Restrictions.like("cust_name", "李%"));
		
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		Criteria criteria = detachedCriteria.getExecutableCriteria(session);
		List<Customer> list = criteria.list();
		for (Customer customer : list) {
			System.out.println(customer);
		}
		tx.commit();
	}
}

程序运行结果 :

 Hibernate的查询方式五:SQL检索

SQL查询:通过使用sql语句进行查询

查询结果数据封装成Object数组 :

package testdemo02;

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

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

import czm.hibernate.domain.Customer;
import czm.hibernate.utils.HibernateUtils;

public class TestDemo02 {
	@Test
	public void demo1(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		//查询结果数据封装成Object数组
		/*SQLQuery sqlQuery = session.createSQLQuery("select * from cst_customer");
		List<Object[]> list = sqlQuery.list();
		for (Object[] objects : list) {
			System.out.println(Arrays.toString(objects));
		}*/
		
		//查询结果数据封装成对象
		SQLQuery sqlQuery = session.createSQLQuery("select * from cst_customer");
		sqlQuery.addEntity(Customer.class);
		List<Customer> list = sqlQuery.list();
		for (Customer customer : list) {
			System.out.println(customer);
		}
		tx.commit();
	}
}

程序运行结果 : 

查询结果数据封装成对象 : 

package testdemo02;

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

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

import czm.hibernate.domain.Customer;
import czm.hibernate.utils.HibernateUtils;

public class TestDemo02 {
	@Test
	public void demo1(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		//查询结果数据封装成Object数组
		/*SQLQuery sqlQuery = session.createSQLQuery("select * from cst_customer");
		List<Object[]> list = sqlQuery.list();
		for (Object[] objects : list) {
			System.out.println(Arrays.toString(objects));
		}*/
		
		//查询结果数据封装成对象
		SQLQuery sqlQuery = session.createSQLQuery("select * from cst_customer");
		sqlQuery.addEntity(Customer.class);
		List<Customer> list = sqlQuery.list();
		for (Customer customer : list) {
			System.out.println(customer);
		}
		tx.commit();
	}
}

程序运行结果 : 

猜你喜欢

转载自blog.csdn.net/Rachel_pan/article/details/86726963