Свободный синтаксис приведения NHibernate и MySQL?

У меня есть таблица в MySQL, в которой есть строковый столбец «Id» в форме «Xnnnn», где nnnn — число.

Я хочу найти наибольший определенный nnnn. Так что я:

var c = s.CreateCriteria(typeof(Item))
  .AddOrder(Order.Desc(
    Projections.Cast(
       NHibernateUtil.Int32,
       Projections.SqlFunction("substring", NHibernateUtil.String, 
                               Projections.Property("Id"), 
                               Projections.Constant(2), Projections.Constant(10)))
       ))
       .SetProjection(Projections.Property("Id"))
       .SetMaxResults(1)
       .List<string>();

Но NHibernate генерирует SQL:

SELECT this_.Id as y0_ FROM `Item` this_ 
  ORDER BY cast(substring(this_.Id, ?p0, ?p1) as INTEGER) desc limit ?p2

Что MySQL не любит... он настаивает на:

cast(substring(this_.Id, ?p0, ?p1) as SIGNED INTEGER) 

Я пробовал разные типы в актерском составе, и ни один из них не дает правильного результата. Все остальное, что мне нужно сделать с отображением, работает просто отлично.

Какие-либо предложения?


person Rob Walker    schedule 14.09.2010    source источник
comment
Я не настраиваю диалект явно, я использую Fluent NHibernate и предполагаю, что он обрабатывается там. Когда я попытался установить его в конфигурации, возникло исключение, заключающееся в том, что свойство уже установлено.   -  person Rob Walker    schedule 14.09.2010


Ответы (1)


Это ошибка в NH. Исправлено в версии 3.0 Alpha2. См. NH-2261 и NH-2149 для справки.

Тут я вижу 2 варианта:

  1. Собственный SQL-запрос (session.CreateSQLQuery())
  2. Обновитесь до NH 3.0 (помните, что это все еще альфа-версия, хотя и довольно стабильная)
person Filip Zawada    schedule 20.09.2010
comment
3) бэкпорт. Когда я сообщил об ошибке в диалекте (исправленной в версии 3.0), Фабио порекомендовал просто добавить провайдера версии 3.0 в пользовательскую сборку версии 2.x. Это тоже может сработать. - person Gabe Moothart; 20.09.2010
comment
@Gabe Moothart: Да, но, использовав это решение в прошлом, я избегаю его, когда это возможно. Это просто добавляет еще одну вещь, о которой нужно помнить: мы используем кастомную сборку NH. Однако это хороший вариант, если вы применяете в точности те же изменения, которые уже реализованы в версии 3.0. - person Filip Zawada; 20.09.2010