我试图用一个简单的限制来限制左外连接,但它失败并带有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是正确的,但变量不会发送到服务器。
答案 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>();