为什么ICriteria没有将变量值传递给withClause?

时间:2011-09-14 11:48:10

标签: nhibernate icriteria

我试图用一个简单的限制来限制左外连接,但它失败并带有sql异常。

  

System.Data.SqlClient.SqlException:必须声明标量变量“@ p1”。

我的ICriteria:

 var r = session.CreateCriteria<Parent>("p")
.CreateCriteria("p.Children", "c", NHibernate.SqlCommand.JoinType.LeftOuterJoin, Restrictions.Eq("c.Name", "John Doe"))
.List();

所需的SQL:

SELECT * FROM Parents p
LEFT OUTER JOIN Children c ON c.ParentID = p.ID AND c.Name = 'John Doe' 

我是否必须以任何方式添加变量值? NHibernate生成的SQL是正确的,但变量不会发送到服务器。

1 个答案:

答案 0 :(得分:2)

我认为你可能在NHibernate ICriteria中发现了一个错误,你在一个集合中加入LeftOuterJoin但实体有两个或更多集合。在这种情况下,它将使用两个参数在两个集合上生成带有'和'的连接,但只提供一个参数。数据库将抛出:

Insufficient parameters supplied to the command

open a bug可能是个好主意。与此同时,HQL支持这一点:

var query = session.CreateQuery(
  "select p from Parent p left outer join p.Children as c with c.Name = :name");

query.SetString("name", "John Doe");
var parents = query.List<Parent>();