3

我需要检索状态文件 = 10 的文件,并且空值从 oracle 数据库中形成一个可为空的 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);

如果我删除最后一行,它可以工作,但我无法找到一种方法来添加空值的条件。

我怎么能这样做?

4

3 回答 3

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 中没有索引空值(至少几年前我使用它时),并且在大表中查找空值可能非常慢。

于 2013-04-17T08:09:08.640 回答
2
ICriteria criteria = NHibernateSession.CreateCriteria(persitentType);  
criteria.Add(Restrictions.Or (
    Restrictions.Eq ("StatusFile", 10), 
    Restrictions.IsNull ("StatusFile)
));
于 2013-04-17T08:48:08.600 回答
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>();
于 2013-04-17T09:23:49.350 回答