2009-04-08 21 views
0

私は、次のSQLコードに似た何か実行することになりDetachedCriteriaを作成したいのですが、外に参加している設定で、OracleのNVLのようなものを使用する方法:NHibernateはDetachedCriteriaを -

select * 
FROM PRICELIST pl 
LEFT OUTER JOIN PRICELISTDURATIONSHIFT sh ON sh.PRICELISTID = pl.ID 
WHERE sh.CUSTOMERID = :cust 
    AND nvl(sh.DATEFROM, pl.DATEFROM) <= :dt 
ORDER BY nvl(sh.DATEFROM, pl.DATEFROM) DESC 

私は左することができるよにPriceListDurationShiftクラス/テーブルを外部結合し、Customer制約を追加してください。しかし、nvl(sh.DATEFROM、pl.DATEFROM)のようなものを追加する方法を見つけることができません。< =:dt制限。

高度なDetachedCriteriaクエリに関するこのサンプルと、NHibernateマテリアルに関するアドバイスについては、何かアドバイスをありがとうと思います。


うまくいけば、これは動作します:

var priceLists = priceListRepo.FindAll(DetachedCriteria.For<PriceList>("pl") 
    .CreateCriteria((PriceList x) => x.PriceListDurationShifts,() => shift, 
     JoinType.LeftOuterJoin) 
    .Add<PriceListDurationShift>(x => x.Customer == cust) 
    .Add(Expression.Or(
     Expression.And(Restrictions.IsNull("shift.DateFrom"), 
      Restrictions.Le("pl.DateFrom", dt.DateTo)), 
     Expression.And(Restrictions.IsNotNull("shift.DateFrom"), 
      Restrictions.Le("shift.DateFrom", dt.DateTo)) 
     )) 
    ) 
    .ToList(); 

答えて

1

私もこのような何かを探してきましたが、それに対する解決策を見つけていません。

その間、私はCriteria APIの代わりにHQLを使用してこれを解決しました。

HQLには、この目的のために使用できる方法​​3210があります。

from PriceList as pl 
left join pl.PriceListDurationShift as shift 
where coalesce (shift.DateFrom, pl.DateFrom) <= :dt 
order by coalesce (shift.DateFrom, pl.DateFrom) 
+0

それはおそらく、この場合のようにProjections.SQLFunctionで解決することができますhttp://stackoverflow.com/questions/793166/how-to-user-year-and-month-functions-in-nh-基準 - API – Buthrakaur