似乎在使用以下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 :(得分:0)
我不使用nHibernate,但我认为这是您需要生成的SQL:
SELECT *
FROM BaseTable
LEFT JOIN SubTable sub
ON Sub.ForeignKey = BaseTable.PrimaryKey and sub.Property <> value
你想要的是什么,不是一个地方,而是一个附加条件。希望有所帮助。
答案 1 :(得分: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>();