Почему ICriteria не передает значение переменной в withClause? - PullRequest
2 голосов
/ 14 сентября 2011

Я пытаюсь ограничить левое внешнее объединение простым ограничением, но оно завершается ошибкой с исключением из sql.

System.Data.SqlClient.SqlException: необходимо объявить скалярную переменную "@ p1".

Мои критерии:

 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' 

Нужно ли каким-либо образом добавлять значения переменных? SQL, сгенерированный NHibernate, правильный, но переменная просто не отправляется на сервер.

1 Ответ

2 голосов
/ 14 сентября 2011

Я думаю, что вы могли найти ошибку в NHibernate ICriteria, когда вы объединяетесь с LeftOuterJoin в одной коллекции, но у сущности есть две или более коллекций. В этом случае он будет генерировать объединения с 'и' в обеих коллекциях с двумя параметрами, но только с одним. И базу данных выкинет:

Insufficient parameters supplied to the command

Хорошей идеей было бы открыть ошибку . Между тем, это поддерживается 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>();
...