2012-10-09 73 views
1

我有一個標準查詢,工作得很好。休眠標準查詢...添加新條件

Criteria criteria = getSession().createCriteria(getPersistentClass()); 
criteria.add(Restrictions.eq("employerId",employerId)) 
     .setFetchMode("card", FetchMode.JOIN) 
     .createCriteria("card") 
     .addOrder(Order.desc("cardId")) 
     .createCriteria("salary") 
     .add(Restrictions.eq("salaryType",SalaryIdentifierType.CONTRACTOR)) 
     .add(Restrictions.eq("active","YES")); 

現在,我需要添加另一個過濾器(條件)到這個標準。新的過濾器是joinDate。如果joinDate值已從前端傳遞過來,那麼我將不得不將其添加到此查詢中,否則不應添加過濾器joinDate。 (我知道,它的奇怪...但AFAIK,只有disjunction給出了在運行時添加過濾器的設施,只有它存在時纔會這樣做)。我是這樣做的,但我不想在這裏使用分離,我正在尋找其他選項。

Criteria criteria = getSession().createCriteria(getPersistentClass()); 
------------------------------------------------------------------------- 
Disjunction disjunctionDate = Restrictions.disjunction(); 
    if(utilDate!=null){ 
    disjunctionDate = (Disjunction) disjunctionDate.add(Restrictions.ge("startDate", utilDate)); 
    } 
----------------------------------------------------------------------- 
    criteria.add(Restrictions.eq("employerId",employerId)) 
      .setFetchMode("card", FetchMode.JOIN) 
      .createCriteria("card") 
      .addOrder(Order.desc("cardId")) 
      .createCriteria("salary") 
      .add(Restrictions.eq("salaryType",SalaryIdentifierType.CONTRACTOR)) 
      .add(Restrictions.eq("active","YES")) 
       .add(disjunctionDate); 

我剛纔用if條件,這樣可是不行的嘗試(甚至使這種編譯,我不得不修改查詢格式從上面有每行每行和分號標準)。

Criteria criteria = getSession().createCriteria(getPersistentClass()); 
    criteria.add(Restrictions.eq("employerId",employerId)); 
    criteria.setFetchMode("card", FetchMode.JOIN); 
    criteria.createCriteria("card"); 
    criteria.addOrder(Order.desc("cardId")); 
    criteria.createCriteria("salary"); 
    criteria.add(Restrictions.eq("salaryType",SalaryIdentifierType.CONTRACTOR)); 
    criteria.add(Restrictions.eq("active","YES")); 
    if(startDate!=null){ 
     criteria.add(Restrictions.ge("startDate",startDate)); 
    } 

任何想法如何使這個工作比使用disjunction更好的選擇?

回答

4

所以你說這不適合你?

Criteria criteria = getSession().createCriteria(getPersistentClass()) 
    .add(Restrictions.eq("employerId",employerId)) 
    .setFetchMode("card", FetchMode.JOIN) 
    .createCriteria("card") 
    .addOrder(Order.desc("cardId")) 
    .createCriteria("salary", "sl") // <- alias for salary 
    .add(Restrictions.eq("sl.salaryType",SalaryIdentifierType.CONTRACTOR)) 
    .add(Restrictions.eq("sl.active","YES")); 

if(startDate!=null) { 
    criteria.add(Restrictions.ge("sl.startDate",startDate)); 
} 

http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#querycriteria-associations

+0

yes..it是不工作...基本上是 「statrtDate」 是在工資表中,但不會對 「getPersistentClass()」 表中。在你的文章中顯示的代碼中,hibernate將嘗試在「getPersistentClass()」表中找到startDate列。因此它不會工作 – user1717230

+1

在你的問題中,你沒有提到startDate在另一個表中。無論如何,我編輯我的答案。您需要爲工資指定別名。 –