1. 程式人生 > >關於HQL Criteria Restrictions.eq 兩表關聯和三表關聯查詢分析總結筆記

關於HQL Criteria Restrictions.eq 兩表關聯和三表關聯查詢分析總結筆記

兩表關聯 TBorrow表和TUser表關聯ID查詢,依據 <many-to-one name="TUserByAdminId" class="com.shop.model.TUser" fetch="select">
  1. DetachedCriteria criteria = DetachedCriteria.forClass(TBorrow.class);  
  2. criteria.add(Restrictions.eq("TUserByBorrowPeopleId.id", user));  
  3. getHibernateTemplate().findByCriteria(criteria)或criteria.list()  

以上測試通過! 三表關聯 如果一次類推, 依據 <many-to-one name="TBookOfBorrow" class="com.shop.model.TBook" fetch="select"> <many-to-one name="TBaserefByBookGrade" class="com.shop.model.TBaseref" fetch="select"> 一次類推
  1. DetachedCriteria criteria = DetachedCriteria.forClass(TBorrow.
    class);  
  2. criteria.add(Restrictions.eq("TBookOfBorrow.TBaserefByBookCategory.id", user));  
  3. getHibernateTemplate().findByCriteria(criteria)或criteria.list()  

執行出錯,可見Restrictions無法三表分析,通過測試得到,Restrictions僅僅只能得到關聯表的ID值,英雌為了實現三表查詢,改進查詢語句,得到如下程式碼
  1. DetachedCriteria criteria = DetachedCriteria.forClass(TBorrow.
    class);  
  2. Session session=getSession();  
  3. List<Integer> list=new ArrayList<Integer>();  
  4. List<TBook> tBooks=session.createCriteria(TBook.class).add(Restrictions.eq("TBaserefByBookCategory.id", category)).list();  
  5. list.add(tBooks.get(i).getId());  
  6. criteria.add(Restrictions.in("TBookOfBorrow.id"
    ,list));  
  7. getHibernateTemplate().findByCriteria(criteria)或criteria.list()  

拆分標的查詢成功執行,得到所需的結果。2013/7/29 0:04 今天早上通過上網瀏覽和查詢API,終於找到了更簡單的方法,在此記下來 Alias  別名 criteria的子查詢考這個來完成。包括LEFT_JOIN,INNER_JOIN,FULL_JOIN 所以以上想實現TBookOfBorrow.TBaserefByBookCategory.id只要給其中的一個去一個別名就行 如 TBookOfBorrow    -->  t t.TBaserefByBookCategory.id 這樣就行了 同樣,通過表的其他欄位來查詢也需要這個方式 上面程式碼改成:
  1. DetachedCriteria criteria = DetachedCriteria.forClass(TBorrow.class);  
  2. criteria.createAlias("TBookOfBorrow""t");  
  3. criteria.add(Restrictions.eq("t.TBaserefByBookCategory.id", category));  
  4. getHibernateTemplate().findByCriteria(criteria)或criteria.list()