Свободный синтаксис NHibernate и MySQL? - PullRequest
2 голосов
/ 14 сентября 2010

У меня есть таблица в 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) 

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

Есть предложения?

1 Ответ

1 голос
/ 20 сентября 2010

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

Здесь я вижу 2 варианта:

  1. Собственный SQL-запрос (session.CreateSQLQuery ())
  2. Обновление до NH 3.0 (помните, что это все еще Альфа, хотя довольно стабильно)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...