ssh備考-03hibernate各種查詢方式

01搭建hibernate框架

02多表關聯關係映射

03hibernate各種查詢方式


目錄

一、通過主鍵查詢&對象導航方式

Demo1to2.java

二、HQL的檢索方式 ★(用得最多) (除條件查詢專用三外)

Demo3.java

三、QBC的檢索方式 ★ (條件查詢專用   也只會用在條件查詢 )

Demo4.java

四、HQL多表查詢


資料下載地址: 直接下載hibernate02_1.zip       網盤備份下載

本篇就是在上篇項目的基礎進行的測試查詢

1. 唯一標識OID的檢索方式 (就是通過主鍵來查詢  簡單)
    * session.get(對象.class,OID) 
    * session.load(對象.class,OID) 延遲加載
2. 對象的導航的方式  new User().getRole().getRname()   (簡單  原理其實是el表達式的寫法${user.customer.linkman})
    *Customer.getLinkmans() 查詢Customer下所有客戶的對象導航方式

**Hibernate框架推薦使用3、4兩種方式查詢**
3. HQL的檢索方式
    * Hibernate Query Language    -- Hibernate的查詢語言

4. QBC的檢索方式
    * Query By Criteria    -- 條件查詢

5. SQL檢索方式(瞭解)
    * 本地的SQL檢索
 

 

一、通過主鍵查詢&對象導航方式

Demo1to2.java

package cn.ahpu.testQuery;

import java.util.Set;

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

import cn.ahpu.domain.Customer;
import cn.ahpu.domain.Linkman;
import cn.ahpu.utils.HibernateUtils;

/**
 * 對象導航方式查詢
 * @author 軟件163韓竹安
 * 2019年12月23日-下午7:25:11
 */
public class Demo1to2 {
	/**
	 * 導入數據
	 */
	@Test
	public void data(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		//準備數據
		Customer c1 = new Customer("張三", "110");
		Customer c2 = new Customer("李四", "120");
		Customer c3 = new Customer("王五", "119");
		Customer c4 = new Customer("趙六", "114");
		Linkman l1=new Linkman("張媽", "110");
		Linkman l2=new Linkman("張爸", "110");
		Linkman l3=new Linkman("張爺", "110");
		Linkman l4=new Linkman("李爸", "120");
		Linkman l5=new Linkman("李媽", "120");
		Linkman l6=new Linkman("王爸", "119");
		Linkman l7=new Linkman("王媽", "119");
		Linkman l8=new Linkman("趙志成", "114");
		//單向關聯
		c1.getLinkmans().add(l1);
		c1.getLinkmans().add(l2);
		c1.getLinkmans().add(l3);
		c2.getLinkmans().add(l4);
		c2.getLinkmans().add(l5);
		c3.getLinkmans().add(l6);
		c3.getLinkmans().add(l7);
		c4.getLinkmans().add(l8);
		//級聯保存
		session.save(c1);
		session.save(c2);
		session.save(c3);
		session.save(c4);
		
		tr.commit();
	}
	
	/**
	 * 對象導航方式
	 * 
	 * 通過客戶直接拿聯繫人
	 */
	@Test
	public void test1(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		Customer c = session.get(Customer.class, 1L);//查到了customer後
		System.out.println("============================");
		Set<Linkman> linkmans = c.getLinkmans();//其下有哪些聯繫人不用查了,直接拿即可,自動發送sql語句幫你查								纔開始發送sql語句   
		for (Linkman l : linkmans) {
			System.out.println(l);
		}
		tr.commit();
	}
	
	/**
	 * 對象導航方式
	 * 
	 * 通過聯繫人直接拿客戶
	 */
	@Test
	public void test2(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		Linkman l = session.get(Linkman.class, 1L);
		System.out.println(l.getCustomer());//所屬客戶不用查了,直接拿
		tr.commit();
	}
}

因爲簡單,因此用得很多

 

二、HQL的檢索方式 ★(用得最多) (除條件查詢專用三外)

1. HQL的介紹
        HQL(Hibernate Query Language) 是面向對象的查詢語言, 它和 SQL 查詢語言有些相似
        在 Hibernate 提供的各種檢索方式中, HQL 是使用最廣的一種檢索方式

2. HQL與SQL的關係
    * HQL 查詢語句是面向對象的,Hibernate負責解析HQL查詢語句, 然後根據對象-關係映射文件中的映射信息, 把 HQL 查詢語句翻譯成相應的 SQL 語句. 
    * HQL 查詢語句中的主體是域模型中的類及類的屬性  即操作面向javabean的查詢語句
    * SQL 查詢語句是與關係數據庫綁定在一起的. SQL查詢語句中的主體是數據庫表及表的字段  即面向數據庫表的查詢語句
 

1. HQL基本的查詢格式
    * 支持方法鏈的編程,即直接調用list()方法
    * 簡單的代碼如下
        * session.createQuery("from Customer").list();

2. 使用別名的方式
    * 可以使用別名的方式
        * session.createQuery("from Customer c").list();
        * session.createQuery("select c from Customer c").list();

3. 排序查詢
    * 排序查詢和SQL語句中的排序的語法是一樣的
        * 升序
            * session.createQuery("from Customer order by cust_id").list();
        
        * 降序
            * session.createQuery("from Customer order by cust_id desc").list();

4. 分頁查詢
    * Hibernate框架提供了分頁的方法,咱們可以調用方法來完成分頁 limit 查詢起始處,每頁幾條  (當前頁-1)*pagesize《==》頁起始頁碼
    * 兩個方法如下
        * setFirstResult(a)        -- 從哪條記錄開始,如果查詢是從第一條開啓,值是0
        * setMaxResults(b)        -- 每頁查詢的記錄條數
        
    * 演示代碼如下
        * List<LinkMan> list = session.createQuery("from LinkMan").setFirstResult(0).setMaxResults().list();

5. 帶條件的查詢   (瞭解  條件查詢是QBC的專利)
    * setParameter("?號的位置,默認從0開始","參數的值"); 不用考慮參數的具體類型
    * 按位置綁定參數的條件查詢(指定下標值,默認從0開始)
    * 按名稱綁定參數的條件查詢(HQL語句中的 ? 號換成 :名稱 的方式)
    * 例如代碼如下
        Query query = session.createQuery("from Linkman where lkm_name like ? order by lkm_id desc");
        query.setFirstResult(0).setMaxResults(3);
        query.setParameter(0, "%熊%");
        List<Linkman> list = query.list();
        for (Linkman linkman : list) {
            System.out.println(linkman);
        }
 

投影查詢,可以全查詢然後少輸出點不就行了

1. 投影查詢就是想查詢某一字段的值或者某幾個字段的值   select custName,custPhone from Customer;
2. 投影查詢的案例
    * 如果查詢多個字段,例如下面這種方式
        List<Object[]> list = session.createQuery("select c.cust_name,c.cust_level from Customer c").list();
        for (Object[] objects : list) {
            System.out.println(Arrays.toString(objects));
        }
    
    * 如果查詢兩個字段,也可以把這兩個字段封裝到對象中
        * 先在持久化類中提供對應字段的構造方法
        * 使用下面這種HQL語句的方式
            List<Customer> list = session.createQuery("select new Customer(c.cust_name,c.cust_level) from Customer c").list();
            for (Customer customer : list) {
                System.out.println(customer);
            }
 

聚合函數查詢的api

1. 獲取總的記錄數
    Session session = HibernateUtils.getCurrentSession();
    Transaction tr = session.beginTransaction();
    List<Number> list = session.createQuery("select count(c) from Customer c").list();
    Long count = list.get(0).longValue();
    System.out.println(count);
    tr.commit();

2. 獲取某一列數據的和
    Session session = HibernateUtils.getCurrentSession();
    Transaction tr = session.beginTransaction();
    List<Number> list = session.createQuery("select sum(c.cust_id) from Customer c").list();
    Long count = list.get(0).longValue();
    System.out.println(count);
    tr.commit();
 

Demo3.java

package cn.ahpu.testQuery;

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.ahpu.domain.Customer;
import cn.ahpu.domain.Linkman;
import cn.ahpu.utils.HibernateUtils;

/**
 * HQL查詢方式
 * @author 軟件163韓竹安
 * 2019年12月23日-下午7:25:11
 */
public class Demo3 {
	
	/**
	 * 基本查詢
	 * 查詢所有
	 */
	@Test
	public void test1(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		Query query = session.createQuery("from Customer");
		List<Customer> customers = query.list();//也可直接session.createQuery("from Customer").list
		for (Customer c : customers) {
			System.out.println(c);
		}
		tr.commit();
	}
	
	/**
	 * 排序查詢
	 */
	@Test
	public void test2(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		//升序
		Query query = session.createQuery("from Customer order by custId");
		List<Customer> customers = query.list();
		for (Customer c : customers) {
			System.out.println(c);
		}
		
		System.out.println("==========================");
		//降序
		query = session.createQuery("from Customer order by custId desc");
		customers = query.list();
		for (Customer c : customers) {
			System.out.println(c);
		}
		tr.commit();
	}
	
	/**
	 * 分頁查詢
	 * 
	 * setFirstResult(a)  起始頁碼a(=(當前頁-1)*pagesize)
     * setMaxResults(b)   每頁記錄條數b
	 */
	@Test
	public void test3(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		Query query = session.createQuery("from Linkman");
		int page=3;  //當前頁  重1開始
		int b=2;//每頁記錄條數 一般定死
		query.setFirstResult((page-1)*b);
		query.setMaxResults(b);
		List<Linkman> list = query.list();
		System.out.println("每頁"+b+"條,則第"+page+"頁內容如下");
		for (Linkman l : list) {
			System.out.println(l);			
		}
		tr.commit();
	}
	
	/*****************************************聚合查詢*****************************************/
	/**
	 * 聚合函數: count() sum() avg() max() min()
	 */
	//count()
	@Test
	public void test4(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		//查詢所有聯繫人的數量   //Number是Long Integer的父類  //返回的是數量
		List<Number> list = session.createQuery("select count(*) from Linkman").list();
		Long count = list.get(0).longValue();
		System.out.println("聯繫人總數:"+count);
		//System.out.println("聯繫人總數:"+list.get(0));//直接這麼寫即可
		tr.commit();
	}
	
	//sum()
	@Test
	public void test5(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		//所有人的id值之和
		List<Number> list = session.createQuery("select sum(lkmId) from Linkman").list();
		Long count = list.get(0).longValue();
		System.out.println("聯繫人id值之和:"+count);
		//System.out.println("聯繫人總數:"+list.get(0));//直接這麼寫即可
		tr.commit();
	}
	
}

 

三、QBC的檢索方式 ★ (條件查詢專用   也只會用在條件查詢 )

所有查詢都列出來,但只練習QBC條件查詢

0. QBC:Query By Criteria  按條件進行查詢

1. 簡單查詢,使用的是Criteria接口
    List<Customer> list = session.createCriteria(Customer.class).list();
    for (Customer customer : list) {
        System.out.println(customer);
    }

2. 排序查詢
    * 需要使用addOrder()的方法來設置參數,參數使用org.hibernate.criterion.Order對象
    * 具體代碼如下:
        Session session = HibernateUtils.getCurrentSession();
        Transaction tr = session.beginTransaction();
        Criteria criteria = session.createCriteria(Linkman.class);
        // 設置排序
        criteria.addOrder(Order.desc("lkm_id"));
        List<Linkman> list = criteria.list();
        for (Linkman linkman : list) {
            System.out.println(linkman);
        }
        tr.commit();

3. 分頁查詢
    * QBC的分頁查詢也是使用兩個方法
        * setFirstResult();
        * setMaxResults();
    
    * 代碼如下;
        Session session = HibernateUtils.getCurrentSession();
        Transaction tr = session.beginTransaction();
        Criteria criteria = session.createCriteria(Linkman.class);
        // 設置排序
        criteria.addOrder(Order.desc("lkm_id"));
        criteria.setFirstResult(0);
        criteria.setMaxResults(3);
        List<Linkman> list = criteria.list();
        for (Linkman linkman : list) {
            System.out.println(linkman);
        }
        tr.commit();

4. 條件查詢(Criterion是查詢條件的接口,Restrictions類是Hibernate框架提供的工具類,使用該工具類來設置查詢條件)
    * 條件查詢使用Criteria接口的add方法,用來傳入條件。
    * 使用Restrictions的添加條件的方法,來添加條件,例如:
        * Restrictions.eq            -- 相等
        * Restrictions.gt            -- 大於號
        * Restrictions.ge            -- 大於等於
        * Restrictions.lt            -- 小於
        * Restrictions.le            -- 小於等於
        * Restrictions.between        -- 在之間
        * Restrictions.like            -- 模糊查詢
        * Restrictions.in            -- 範圍
        * Restrictions.and            -- 並且
        * Restrictions.or            -- 或者
    
    * 測試代碼如下
        Session session = HibernateUtils.getCurrentSession();
        Transaction tr = session.beginTransaction();
        Criteria criteria = session.createCriteria(Linkman.class);
        // 設置排序
        criteria.addOrder(Order.desc("lkm_id"));
        // 設置查詢條件
        criteria.add(Restrictions.or(Restrictions.eq("lkm_gender", "男"), Restrictions.gt("lkm_id", 3L)));
        List<Linkman> list = criteria.list();
        for (Linkman linkman : list) {
            System.out.println(linkman);
        }
        tr.commit();

5. 聚合函數查詢(Projection的聚合函數的接口,而Projections是Hibernate提供的工具類,使用該工具類設置聚合函數查詢)
    * 使用QBC的聚合函數查詢,需要使用criteria.setProjection()方法
    * 具體的代碼如下
        Session session = HibernateUtils.getCurrentSession();
        Transaction tr = session.beginTransaction();
        Criteria criteria = session.createCriteria(Linkman.class);
        criteria.setProjection(Projections.rowCount());
        List<Number> list = criteria.list();
        Long count = list.get(0).longValue();
        System.out.println(count);
        tr.commit();
    *前面條件查詢是criteria.add(Restrictions.條件) 此處聚合函數是criteria.setProjection(Projections.聚合函數)
    *注意:Projections.聚合函數   Projections下幾乎封裝了所有的集合函數 比如:
        Projections.max,Projections.count,Projections.avg等等
    *此處是criteria.list  模板就是getHibernateTemplate().findByCriteria(criteria);
 

1. 離線條件查詢使用的是DetachedCriteria接口進行查詢,離線條件查詢對象在創建的時候,不需要使用Session對象,只是在查詢的時候使用Session對象即可。
2. 創建離線條件查詢對象
    * DetachedCriteria criteria = DetachedCriteria.forClass(Linkman.class);

3. 具體的代碼如下
    Session session = HibernateUtils.getCurrentSession();
    Transaction tr = session.beginTransaction();
    
    DetachedCriteria criteria = DetachedCriteria.forClass(Linkman.class);
    // 設置查詢條件
    criteria.add(Restrictions.eq("lkm_gender", "男"));
    // 查詢數據
    List<Linkman> list = criteria.getExecutableCriteria(session).list();
    for (Linkman linkman : list) {
        System.out.println(linkman);
    }
    tr.commit();
 

Demo4.java

package cn.ahpu.testQuery;

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

import cn.ahpu.domain.Customer;
import cn.ahpu.domain.Linkman;
import cn.ahpu.utils.HibernateUtils;

/**
 * 測試QBC的檢索方式 
 * @author 軟件163韓竹安
 * 2019年12月23日-下午10:49:24
 */
public class Demo4 {
	/*********************簡單演示普通查詢*********************/
	//查詢所有
	@Test
	public void test1(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		List<Customer> list = session.createCriteria(Customer.class).list();
		for (Customer c : list) {
			System.out.println(c);
		}
		tr.commit();
	}
	
	//排序查詢
	@Test
	public void test2(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		Criteria criteria = session.createCriteria(Customer.class);
		criteria.addOrder(Order.desc("custId"));//qbc各種查詢方式看起來都像是條件查詢  都是加條件的形式
		List<Customer> list = criteria.list();
		for (Customer c : list) {
			System.out.println(c);
		}
		tr.commit();
	}
	
	//分頁查詢和HQL差不多
	@Test
	public void test3(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		Criteria criteria = session.createCriteria(Customer.class);
		criteria.addOrder(Order.desc("custId"));//qbc各種查詢方式看起來都像是條件查詢  都是加條件的形式
		//加兩個條件就變成了條件查詢
		criteria.setFirstResult((2-1)*2);
		criteria.setMaxResults(2);//每頁兩個查詢 查詢第二頁
		List<Customer> list = criteria.list();
		for (Customer c : list) {
			System.out.println(c);
		}
		tr.commit();
	}
	
	/**********************************重頭戲,條件查詢**********************************/
	@Test
	public void test4(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		Criteria criteria = session.createCriteria(Linkman.class);
		
		//添加條件   where lkmName like "李%" or lkmPhone = '114'
		criteria.add(Restrictions.or(Restrictions.eq("lkmPhone", "114"),
					 Restrictions.like("lkmName", "李%")));//add(Restrictions()嵌套形式)  添加條件
		
		//between查詢 (兩次測試並一次寫的)
		/*criteria.add(Restrictions.between("lkmId",2L,5L));*/
		
		List<Linkman> list = criteria.list();
		for (Linkman l : list) {
			System.out.println(l);
		}
		tr.commit();
	}
	
	
	/**
	 * in查詢
	 */
	@Test
	public void test5(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		Criteria criteria = session.createCriteria(Linkman.class);
		
		/*List<Long> params=new ArrayList<Long>();
		params.add(1L);
		params.add(3L);
		params.add(5L);
		params.add(7L);
		criteria.add(Restrictions.in("lkmId", params));*/
		
		//看api提示可知也可用此一句
		criteria.add(Restrictions.in("lkmId", new Object[]{1L,3L,5L,7L}));
		
		
		List<Linkman> list = criteria.list();
		for (Linkman l : list) {
			System.out.println(l);
		}
		tr.commit();
	}
	
	/**
	 * 是否爲空
	 */
	@Test
	public void test6(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		Criteria criteria = session.createCriteria(Linkman.class);
		
		//查找所有lkmPhone爲空的聯繫人記錄   (測試前故意到數據中刪除兩個字段的lkmPhone)
		//criteria.add(Restrictions.isNull("lkmPhone"));//String類型的""不是null
		criteria.add(Restrictions.isNull("customer"));
		
		List<Linkman> list = criteria.list();
		for (Linkman l : list) {
			System.out.println(l);
		}
		tr.commit();
	}
	
	/**
	 * 演示離線條件對象
	 * 仔細分析下面代碼 大體上和前面的查詢差不多
	 * 離線查詢的好處,不需要session就可以創建查詢接口,就可以設置查詢參數了
	 * 唯一需要session的時候就是執行的時候獲取一下
	 */
	@Test
	public void run10(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		
		//創建離線條件的查詢對象
		DetachedCriteria dcriteria = DetachedCriteria.forClass(Linkman.class);
		//添加查詢的條件了
		dcriteria.add(Restrictions.eq("lkmPhone", "110"));
		//開始查詢了  查詢的時候仍然需要session  那麼就要自己獲取session了   好處真正查詢時才需要session 之前都不要
		List<Linkman> list = dcriteria.getExecutableCriteria(session).list();
		for (Linkman linkman : list) {
			System.out.println(linkman);			
		}
		
		tr.commit();
	}

	@Test
	public void test7(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		DetachedCriteria dcriteria = DetachedCriteria.forClass(Linkman.class);
		dcriteria.add(Restrictions.like("lkmName", "李%"));
		List<Linkman> list = dcriteria.getExecutableCriteria(session).list();//最終查詢時纔要下session
		for (Linkman man : list) {
			System.out.println(man);
		}
		tr.commit();
	}

}

四、SQL檢索方式 (都用hibernate框架了,就不要sql語句了 不瞭解了)

 

未完待續.......

 

四、HQL多表查詢(多表查詢HQL最方便 單獨拿出來)

多表查詢用HQL最簡單
1. 多表的查詢進來使用HQL語句進行查詢,HQL語句和SQL語句的查詢語法比較類似。
	* 內連接查詢
		* 顯示內連接
			* select * from customers c inner join orders o on c.cid = o.cno;
		* 隱式內連接
			* select * from customers c,orders o where c.cid = o.cno;
	
	* 外連接查詢
		* 左外連接
			* select * from customers c left join orders o on c.cid = o.cno;
		* 右外連接
			* select * from customers c right join orders o on c.cid = o.cno;

2. HQL的多表查詢
	* 迫切和非迫切:
		* 非迫切返回結果是Object[]
		* 迫切連接返回的結果是對象,把客戶的信息封裝到客戶的對象中,把訂單的信息封裝到客戶的Set集合中。

3. 內連接查詢
	* 內連接使用 inner join ,默認返回的是Object數組
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		List<Object[]> list = session.createQuery("from Customer c inner join c.linkmans").list();
		for (Object[] objects : list) {
			System.out.println(Arrays.toString(objects));
		}
		tr.commit();
	
	* 迫切內連接:inner join fetch ,返回的是實體對象
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		List<Customer> list = session.createQuery("from Customer c inner join fetch c.linkmans").list();
		Set<Customer> set = new HashSet<Customer>(list);
		for (Customer customer : set) {
			System.out.println(customer);
		}
		tr.commit();

4. 左外連接查詢
	* 左外連接:	封裝成List<Object[]>
	
	* 迫切左外連接
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		List<Customer> list = session.createQuery("from Customer c left join fetch c.linkmans").list();
		Set<Customer> set = new HashSet<Customer>(list);
		for (Customer customer : set) {
			System.out.println(customer);
		}
		tr.commit();

隱式內連接
    select * from customers c,orders o where c.cid = o.cno;
左外連接
    select * from customers c left join orders o on c.cid = o.cno;
右外連接
    select * from customers c right join orders o on c.cid = o.cno;


左外連接,右外連接就是在簡單的連接查詢基礎上加個left join或right join罷了,表示以誰爲主,爲主的全查詢,
另一張表即使沒有與之匹配的也以null填充

不大會考,直接粘貼之前代碼吧

package com.itheima.test;
 
import java.util.Arrays;
import java.util.HashSet;
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 com.itheima.domain.Customer;
import com.itheima.domain.Linkman;
import com.itheima.utils.HibernateUtils;
 
/**
 * HQL的多表查詢
 * @author Administrator
 *
 */
public class Demo5 {
	
	/**
	 * 查詢客戶聯繫人信息
	 * select * from cst_customer c,cst_linkman l where c.id=l.id;
	 */
	@Test
	public void run1(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		
		//內連接的查詢    createQuery默認創建HQL接口(當然,這是Hibernate框架嘛)     創建其他接口就麻煩了createSQLQuery(原始sql語句查詢)
		Query query = session.createQuery("from Customer c inner join c.linkmans");
		//默認的返回值還是Object數組
		List<Object[]> list = query.list();
		for (Object[] objects : list) {
			System.out.println(Arrays.toString(objects));
		}
		tr.commit();
	}
	
	/**
	 * 數據默認返回的數組,但可以自己設置,從而將數據封裝到對象中
	 * 	提供關鍵字:fetch 迫切連接
	 */
	@Test
	public void run2(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		
		//內連接的查詢    createQuery默認創建HQL接口(當然,這是Hibernate框架嘛)     創建其他接口就麻煩了createSQLQuery(原始sql語句查詢)
		Query query = session.createQuery("from Customer c inner join fetch c.linkmans");
		//默認的返回值還是Object數組
		List<Customer> list = query.list();
		for (Customer c : list) {
			System.out.println(c);//toString方法要把linkmans給加上了	
		}
		
		tr.commit();
	}
	
	
	/**
	 * 	數據的重複問題
	 * 手動解決,存入set即可去重
	 */
	@Test
	public void run3(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		
		//內連接的查詢    createQuery默認創建HQL接口(當然,這是Hibernate框架嘛)     創建其他接口就麻煩了createSQLQuery(原始sql語句查詢)
		Query query = session.createQuery("from Customer c inner join fetch c.linkmans");//和自己的集合連接
		//默認的返回值還是Object數組
		List<Customer> list = query.list();
		Set<Customer> set=new HashSet<Customer>(list);
		for (Customer customer : set) {
			System.out.println(customer);//此時所屬聯繫人已經封裝到Set<Linkman> linkmans集合中了
 		}
		tr.commit();
	}
	
	
	/**
	 * 左外連接
	 * 和內連接一樣,把inner改成left即可
	 */
	@Test
	public void run4(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		
		//內連接的查詢    createQuery默認創建HQL接口(當然,這是Hibernate框架嘛)     創建其他接口就麻煩了createSQLQuery(原始sql語句查詢)
		Query query = session.createQuery("from Customer c left join fetch c.linkmans");//和自己的集合連接
		//默認的返回值還是Object數組
		List<Customer> list = query.list();
		Set<Customer> set=new HashSet<Customer>(list);
		for (Customer customer : set) {
			System.out.println(customer);//此時所屬聯繫人已經封裝到Set<Linkman> linkmans集合中了
		}
		tr.commit();
	}
 
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發佈了388 篇原創文章 · 獲贊 89 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章