2010-09-29 57 views
0

看来,当使用下面的NHibernate查询,我没有得到一个根实体时,左外连接没有记录。NHibernate集合左外部加入哪里条款问题

ICriteria critera = session.CreateCriteria(typeof(Entity)); 

criteria.CreateCriteria("SubTable.Property", "Property", NHibernate.SqlCommand.JoinType.LeftOuterJoin); 

criteria.Add(Expression.Not(Expression.Eq("Property", value))); 

,我试图生成SQL是:

SELECT * FROM BaseTable 
LEFT JOIN (
    SELECT * FROM SubTable 
    WHERE Property <> value 
)Sub ON Sub.ForeignKey = BaseTable.PrimaryKey 

注意,where子句是左内加入的SELECT语句。这样如果没有任何加工子记录,我们仍然会获得最高的记录。看起来NHibernate正在生成以下SQL。

SELECT * FROM BaseTable 
LEFT JOIN (
    SELECT * FROM SubTable 
)Sub ON Sub.ForeignKey = BaseTable.PrimaryKey 
WHERE Sub.Property <> value 

有没有办法实现第一块SQL?我已经尝试过了:

ICriteria critera = session.CreateCriteria(typeof(Entity)); 

criteria.CreateCriteria("SubTable.Property", "Property", NHibernate.SqlCommand.JoinType.LeftOuterJoin); 

criteria.Add(
    Restrictions.Disjunction() 
     .Add(Expression.IsNull("Property")) 
     .Add(Expression.Not(Expression.Eq("Property", value))); 

我正在寻找使用Criteria API的解决方案。

+0

你可以看一看NHibernate的日志文件,查看正在发出什么SQL语句。 – 2010-09-30 14:41:56

回答

0

尝试this

var hql = @"select bt 
      from BaseTable bt 
       left join bt.SubTable subt 
        with subt.Property <> :property"; 

或许:

var hql = @"select bt 
      from BaseTable bt 
       left join bt.SubTable subt 
        where subt.ForeignKey = bt.PrimaryKey 
         and subt.Property <> :property"; 

最后:

var result = session.CreateQuery(hql) 
        .SetParameter("property", "whateverValue") 
        .List<BaseTable>(); 
+0

想用NHibernate的Criteria API解决这个问题。谢谢 – a432511 2010-10-04 03:22:12

0

我不使用NHibernate的,但我认为这是你需要生成SQL:

SELECT * 
FROM BaseTable 
LEFT JOIN SubTable sub 
ON Sub.ForeignKey = BaseTable.PrimaryKey and sub.Property <> value 

你想要什么ISN;吨,其中clasue,但是,加入一个附加条件。希望有所帮助。

+0

非常真实......我甚至没有考虑这一点。 – a432511 2010-10-01 19:22:53

+0

这解释了为什么:http://wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN – HLGEM 2010-10-01 19:49:04

+0

我明白这个问题,我想我正在寻找如何使用NHibernate Criteria API来解决它。谢谢! – a432511 2010-10-04 03:21:45