2012-03-02 24 views
9

Tôi đang sử dụng NHibernate để quản lý cơ sở dữ liệu của mình. Trong một lớp Tôi đang tính toán một tài sản sử dụng công thức này:Lỗi trong NHibernate Aliasing

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

Truy vấn được tạo ra trông như thế này:

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

Rõ ràng tên trong báo cáo AS được đổi tên thành this_.x, gây lỗi.

Nó có vẻ là một lỗi được biết: NHibernate JIRA #NH-2878

Liệu enyone có một giải pháp cho việc này?

Trả lời

1

Tôi có thể bị nhầm lẫn, nhưng tôi không thực sự thấy lý do bạn cần bí danh trong công thức cụ thể đó.

Trong một ý nghĩa tổng quát hơn, bạn có một vài lựa chọn:

  • làm việc xung quanh vấn đề này. Bạn có thể sử dụng quy trình được lưu trữ hoặc tải thêm dữ liệu và thực hiện tính toán trong bộ nhớ.
  • Khắc phục sự cố. NHibernate là mã nguồn mở - kéo xuống mã, tìm nguyên nhân, cô lập nó trong một thử nghiệm, sửa chữa nó, và gửi một yêu cầu kéo.
  • Nhờ người khác khắc phục. Nếu công ty của bạn đang sử dụng NHibernate và điều này là quan trọng đối với họ, họ có thể có thể tài trợ cho một người đóng góp NHibernate để thực hiện sửa chữa.
+0

Bí danh chắc chắn là cần thiết, vì lỗi SQL xảy ra khi nó không được sử dụng. Tôi muốn biết liệu có ai đã sửa chữa điều này không. Nếu không có, tôi nghĩ rằng tôi sẽ sử dụng một khung nhìn cơ sở dữ liệu cho vấn đề của tôi. – Coxer

0

tôi sẽ không biết làm thế nào để sửa lỗi nhưng bạn có thể thử bằng văn bản tính của bạn như sau:

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

Tôi có vấn đề này tương tự khi gọi một hàm cơ sở dữ liệu từ bên trong một thành thạo NHibernate Map. Phương thức Formula(). Cách giải quyết của tôi là lặp lại tên đầy đủ chức năng thay vì cố gắng sử dụng ailas.

Ví dụ: trong đó EntityColumn2 là cột đã được tham chiếu \ được tải vào thực thể.

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

Kết quả là các My_Db_Function tài liệu tham khảo ở lại như là (và không aliased bởi NHibernate) và EntityColumn2 là aliased một cách chính xác bởi NHibernate.

+0

Điều này được báo cáo lỗi NHibernate: https://nhibernate.jira.com/browse/NH-2878 –

+0

Tên tiền tố thậm chí có thể hoạt động đối với các loại. Trong trường hợp của tôi NHibernate tiền tố kiểu 'datetime' với bí danh bảng là tốt, nhưng sau khi thay đổi nó thành' sys.datetime' nó đã làm việc. Cũng được đề cập trong http://ayende.com/blog/1720/using-sql-functions-in-nhibernate: "NHibernate sẽ tự động chuyển đổi trước bí danh của bảng thực thể hiện tại thành bất kỳ thứ gì trông giống như truy cập cột không đủ điều kiện" – Chaquotay