NHibernate с Castle, HQL не удалось найти параметр [param]

У меня есть HQL-запрос к классу, сопоставленному с Castle ActiveRecord, и я получаю следующую ошибку: NHibernate.QueryParameterException: не удалось найти именованный параметр [param].

Вот мой класс, упрощенный:

[Serializable]
[ActiveRecord("my_table", Schema = "my_schema", UseAutoImport = false, Mutable = false)]
public class MyTable : MyServerActiveRecord<MyTable> //Extension of ActiveRecordBase<>
{
    [PrimaryKey(PrimaryKeyType.Identity, "my_pk")]
    public int ID {get;set;}

    [Property("my_column1")]
    public int MyColumn1 {get;set;}

    [Property("my_column2")]
    public int MyColumn2 {get;set;}
}

И метод с моим HQL

public static int GetSum(int num1){
    IQuery query = session.CreateQuery(@"
        select sum(case when t.MyColumn2 = 2 then 1 else 0 end)             
        from My.Complete.Namespace.MyTable t 
        where t.MyColumn1 = :num  
        group by t.MyColumn1 
    ");
    query.SetParameter("num", num1);
    return query.UniqueResult<Int32>();
}

Использование SetInt32 вместо SetParameter не помогло. Я проверил интервал в запросе.

Запрос работает нормально, если я бросаю 7, где :num, и полностью вырезаю :num и его оператор set.


person allie    schedule 17.05.2016    source источник
comment
Никогда не видел такой неприятности. Можете ли вы проверить query.NamedParameters, чтобы увидеть, что он находит в вашем HQL запросе?   -  person Frédéric    schedule 18.05.2016
comment
@ Frédéric, не повезло, NamedParameters имеет нулевую длину после определения запроса   -  person allie    schedule 23.05.2016


Ответы (1)


Итак, я заполнял свою переменную сеанса следующим образом:

session = ActiveRecordMediator.GetSessionFactoryHolder().GetSessionFactory(typeof(T)).OpenSession();

где T = тип возвращаемого запроса, также известный как Int32.

Я изменил T на класс, который запрашивал, MyTable, и все начало работать. Облом, что Castle / NHibernate не возвращает более полезную ошибку. Плохо, что я не включил строку сеанса в вопрос.

person allie    schedule 23.05.2016