2010-04-07 65 views
2

我構建一個Hibernate的標準,使用子查詢如下NULL,在Hibernate API的標準再選擇

DetachedCriteria subselect = 
    DetachedCriteria.forClass(NhmCode.class, "sub"); // the subselect selecting the maximum 'validFrom' 
subselect.add(Restrictions.le("validFrom", new Date())); // it should be in the past (null needs handling here) 
subselect.add(Property.forName("sub.lifeCycle").eqProperty("this.id")); // join to owning entity 
subselect.setProjection(Projections.max("validFrom")); // we are only interested in the maximum validFrom 

Conjunction resultCriterion = Restrictions.conjunction(); 
resultCriterion.add(Restrictions.ilike(property, value)); // I have other Restrictions as well 
resultCriterion.add(Property.forName("validFrom").eq(subselect)); // this fails when validFrom and the subselect return NULL 

return resultCriterion; 

它工作正常,到目前爲止處理,但在最後一行的限制之前return語句是假的當validFrom和subselect結果爲NULL時。

我需要的是一個處理這種情況爲真的版本。可能通過應用NVL或聯合或類似的。

我該怎麼做?

更新:有這樣的where子句中sqlRestriction結果----------------------------

彼得斯想法:

 ... 
     and (
      nhmcode1_.valid_from = (
       select 
        max(sub_.valid_from) as y0_ 
       from 
        nhm_code sub_ 
       where 
        sub_.valid_from<=? 
        and sub_.lc_id=this_.id 
      ) 
      or (
       nhmcode1_.valid_from is null 
       and sub.validFrom is null 
      ) 
     ) 
     ... 

這又導致:

ORA-00904: 「SUB _」 「VALIDFROM」:ungültigerBezeichner

錯誤消息的意思是 '無效的標識符'

+0

剛剛發現這個:http://www.opendocs.net/javadoc/hibernate/3/org/hibernate/criterion/Subqueries.html ...也許這有些用處? – 2010-12-10 12:40:10

回答

0

看起來這是Criteria API的一個更多限制。

我發現爲這種事情創建您自己的Criterion(或一組Criteria)其實並不困難。

最大的問題是你基本上必須沒有任何文檔。獲取一些與你想要做的相似的實現。搗毀它,看看它產生的SQL,沖洗並重復。

不好玩,但它的作品。

對不起,我沒有問題的實現可用的問題。

5

你可以嘗試這樣的事情,而不是問題的行:

resultCriterion.add(
    Restrictions.or(
    Restrictions.and(
     Restrictions.isNull("validFrom"), 
     Restrictions.sqlRestriction("sub.validFrom is null") 
    ), 
    Property.forName("validFrom").eq(subselect) 
) 
); 

這可能不會馬上工作,而是希望幫助。

+0

嗨,彼得,不幸的是這只是解決方案的50%。爲符合我的要求,它需要是:resultCriterion.add(Restrictions.or(Restrictions.and( Restrictions.isNull(「validFrom」),Restrictions.isNull(subselect)), Property.forName(「validFrom」)。當量(子選擇))); 但isNull無法接受子查詢(如果會的話,它可能會重複SQL中的suquery,這將是醜陋的,儘管它不會殺死我)。 – 2010-04-07 15:33:10

+0

@Jens我剛更新了這個例子(希望)來處理這個問題。 – 2010-04-07 15:35:49