2011-04-22 27 views
8

Tôi đang cố gắng tham gia và tôi vẫn gặp phải lỗi nàyĐường dẫn được mong đợi để tham gia! Nhibernate Error

Đường dẫn mong đợi để tham gia! [CHỌN t.CourseId TỪ công tác như t INNER JOIN Các khóa học như c, CoursePermissions như cp WHERE (t.CourseId = 1)]

Tôi có

const string query = "SELECT t.CourseId FROM Task as t INNER JOIN Courses as c, CoursePermissions as cp WHERE (t.CourseId = 1)"; 

var a = session.CreateQuery(query); 

Sql My tôi đang cố gắng để đạt được

SELECT  dbo.Tasks.CourseId 
FROM   dbo.Tasks INNER JOIN 
         dbo.Courses ON dbo.Tasks.CourseId = dbo.Courses.CourseId INNER JOIN 
         dbo.CoursePermissions ON dbo.Courses.CourseId = dbo.CoursePermissions.CourseId 
WHERE  (dbo.Tasks.CourseId = 1) 

tôi đang sử dụng nhibernate 3.1 và nhibernate thạo 1.2

Trả lời

14

Điều đó có nghĩa là bạn sử dụng một phép nối bên trong trong HQL hoạt động hơi khác một chút so với việc sử dụng nó trong SQL. Trong HQL bạn tham gia các bảng bằng cách cung cấp "đường dẫn", về cơ bản là thuộc tính được tham chiếu của lớp của bạn.

Vì vậy, thay vì

SELECT t.CourseId FROM Task as t INNER JOIN Courses as c ... 

bạn cần phải viết

// c.Taks is the IList property in your Courses class 
SELECT t.CourseId FROM Courses as c INNER JOIN c.Tasks as t ... 
+0

hoạt động này có hoạt động nếu bạn không có khóa ngoài trên bảng Tác vụ không? – iKode

+0

nó hoạt động ngoài ánh xạ của bạn –

0

Mặc dù Florian Lim đã gợi ý một giải pháp tuyệt vời nhưng trong trường hợp của tôi, tôi đã không có IList cho Nhiệm vụ trong khóa học. Tôi đạt được điều đó thông qua Theta-Style Joins mà thực sự là Cartesian product cung cấp tất cả các kết hợp có thể có thể được lọc (trong mệnh đề where) theo nhu cầu.

Các vấn đề liên quan