Ошибка в NHibernate Aliasing - PullRequest
       21

Ошибка в NHibernate Aliasing

9 голосов
/ 02 марта 2012

Я использую NHibernate для управления базой данных. В одном классе я вычисляю свойство, используя эту формулу:

(SELECT MIN(x.timestamp) FROM (SELECT MAX(r.Timestamp) AS timestamp, r.Meter_Id FROM Reading r, Meter m WHERE r.Meter_Id = m.Id AND m.Store_Id = Id GROUP BY r.Meter_Id) AS x)

Сгенерированный запрос выглядит так:

(SELECT MIN(x.timestamp) FROM (SELECT MAX(r.Timestamp) AS timestamp, r.Meter_Id FROM Reading r, Meter m WHERE r.Meter_Id = m.Id AND m.Store_Id = this_.Id GROUP BY r.Meter_Id) AS this_.x)

Очевидно, что имя в операторе AS переименовано в this_.x, что вызывает ошибку.

Кажется, это известная ошибка: NHibernate JIRA # NH-2878

Есть ли у кого-нибудь решение для этого?

Ответы [ 3 ]

1 голос
/ 22 декабря 2012

У меня была такая же проблема при вызове функции базы данных из метода Fluent NHibernate Map.Formula ().Мой обходной путь состоял в том, чтобы повторить полное имя функции вместо попытки использовать ailas.

Например, где EntityColumn2 - это столбец, на который уже ссылается \ загружается в объект.

SELECT My_Db_Function.Column1
FROM My_Db_Function(arg1, arg2, arg3, ...) 
WHERE My_Db_Function.Column2 = EntityColumn2

В результате ссылки My_Db_Function остаются как есть (и не являются псевдонимами NHibernate), а EntityColumn2 правильно именуется NHibernate.

1 голос
/ 02 марта 2012

Я могу ошибаться, но на самом деле я не понимаю, зачем вам нужен псевдоним в этой конкретной формуле.

В более общем смысле у вас есть несколько вариантов:

  • Обойти проблему. Вы можете использовать хранимую процедуру или загрузить дополнительные данные и выполнить вычисления в памяти.
  • Исправьте это. NHibernate с открытым исходным кодом - опустите код, найдите причину, изолируйте его в тесте, исправьте и отправьте запрос на извлечение.
  • Попросите кого-нибудь еще исправить это. Если ваша компания использует NHibernate и это важно для них, они, возможно, могут спонсировать другого участника NHibernate для внедрения исправления.
0 голосов
/ 27 марта 2012

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

SELECT TOP 1 MAX(r.Timestamp) AS timestamp
FROM Reading r, Meter m
WHERE r.Meter_Id = m.Id AND m.Store_Id = Id
GROUP BY r.Meter_Id
order by Max(r.timestamp) asc
...