我需要检索状态文件= 10的文件,并且null值从oracle db中形成一个可空的VARCHAR2列。
经过一番搜索,我发现了以下内容:
ICriteria criteria = NHibernateSession.CreateCriteria(persitentType);
criteria.Add(Expression.In("StatusFile", 10));
criteria.Add(Restrictions.IsEmpty("StatusFile"));
在sql中会是这样的:
select attstatus from table where file_tmode = 'P'and (status is null or status = 10);
如果我删除最后一行,它可以工作,但我找不到添加空值标准的方法。
我怎么能这样做?
答案 0 :(得分:4)
你试过IsNull
吗?
NHibernateSession.CreateCriteria(persitentType)
.Add(Expression.In("StatusFile", 10))
.Add(Expression.IsNull("StatusFile"));
使用or
NHibernateSession.CreateCriteria(persitentType)
.Add(Expression.In("StatusFile", 10)
|| Expression.IsNull("StatusFile"));
请注意,在oracle中没有索引空值(至少在几年前我使用它时),并且在大型表中找到空值可能会非常慢。
答案 1 :(得分:2)
ICriteria criteria = NHibernateSession.CreateCriteria(persitentType);
criteria.Add(Restrictions.Or (
Restrictions.Eq ("StatusFile", 10),
Restrictions.IsNull ("StatusFile)
));
答案 2 :(得分:0)
的.List() 既然Stefan Steinegger的回答是'和'你的批评,你为什么不尝试脱离('或')? 像这样的东西, -
var query = Session.QueryOver<PersistentType>();
var disjunction = new Disjunction();
disjunction.Add(Restrictions.On<PersistentType>(obj => obj.statusFile == 10));
disjunction.Add(Restrictions.On<PersistentType>(obj => obj.statusFile == null));
var queryResult = query.Where(disjunction).List<PersistentType>();
或者简单地说,
var queryResult = Session.QueryOver<PersistentType>()
.Where(obj => obj.statusFile == 10 || obj.statusFile == null).List<PersistentType>();