2012-03-02 12 views
9

Używam NHibernate do zarządzania bazą danych. w jednej klasie mam obliczania własności za pomocą tego wzoru:Błąd w aliasowaniu 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) 

Wygenerowany zapytań wygląda tak:

(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) 

Oczywiście nazwa w rachunku AS jest zmieniona na this_.x, co powoduje błąd.

To wydaje się być znany błąd: NHibernate JIRA #NH-2878

Czy enyone ma rozwiązanie dla tego?

Odpowiedz

1

Mogę się mylić, ale tak naprawdę nie rozumiem, dlaczego potrzebujesz aliasu w tej konkretnej formule.

W bardziej ogólnym sensie, masz kilka opcji:

  • obejść ten problem. Można użyć procedury składowanej lub załadować więcej danych i wykonać obliczenia w pamięci.
  • Napraw to. NHibernate to open source - rozwiń kod, znajdź przyczynę, wyizoluj go w teście, napraw go i wyślij żądanie ściągnięcia.
  • Poproś kogoś, aby to naprawił. Jeśli twoja firma używa NHibernate i jest to dla nich ważne, prawdopodobnie mogliby sponsorować innego dostawcę NHibernate w celu wprowadzenia poprawki.
+0

Alias ​​jest zdecydowanie potrzebny, ponieważ błąd SQL występuje, gdy nie jest używany. Chciałbym wiedzieć, czy ktoś już to naprawił. Jeśli nie ma, myślę, że będę używać widoku bazy danych dla mojego problemu. – Coxer

0

Nie wiem, jak rozwiązać ten problem, ale można spróbować napisać swoje obliczenia w następujący sposób:

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 
1

miałem ten sam problem podczas wywoływania funkcji bazy danych od wewnątrz Fluent NHibernate mapą. Metoda Formula(). Moim obejściem było powtórzenie pełnej nazwy funkcji zamiast próby użycia ail.

Na przykład, gdy EntityColumn2 jest kolumną, która już jest odwoływana \ ładowana do encji.

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

Rezultatem jest to, że My_Db_Function odniesienia pozostać jak jest (nie są alias przez NHibernate) i EntityColumn2 prawidłowo alias przez NHibernate.

+0

Zgłoszono błąd NHibernate: https://nhibernate.jira.com/browse/NH-2878 –

+0

Nazwy prefiksów mogą nawet działać dla typów. W moim przypadku NHibernate prefiksował typ 'datetime' również z aliasem tabeli, ale po zmianie na' sys.datetime' zadziałało. Również wspomniano w http://ayende.com/blog/1720/using-sql-functions-in-nhibernate: "NHibernate automatycznie wstąpi w pseudonim aktualnej tabeli encji do wszystkiego, co wygląda jak niekwalifikowany dostęp do kolumny" – Chaquotay