LỖI HQL: Đường dẫn được mong đợi để tham gia


100

Tôi tiếp tục thử các biến thể của truy vấn này và dường như không thể biến điều này thành hiện thực. Tôi cũng đã tham khảo bài đăng này: Đường dẫn được mong đợi để tham gia! Lỗi Nhibernate và dường như không thể áp dụng cùng một logic cho truy vấn của tôi. UserĐối tượng của tôi có một UserGroupbộ sưu tập.

Tôi hiểu rằng truy vấn cần tham chiếu đến các thực thể bên trong đối tượng, nhưng từ những gì tôi đang thấy, tôi ...

@NamedQuery(
  name = "User.findByGroupId",
  query =
    "SELECT u FROM UserGroup ug " +
    "INNER JOIN User u WHERE ug.group_id = :groupId ORDER BY u.lastname"
)

Câu trả lời:


131
select u from UserGroup ug inner join ug.user u 
where ug.group_id = :groupId 
order by u.lastname

Như một truy vấn được đặt tên:

@NamedQuery(
  name = "User.findByGroupId",
  query =
    "SELECT u FROM UserGroup ug " +
    "INNER JOIN ug.user u WHERE ug.group_id = :groupId ORDER BY u.lastname"
)

Sử dụng các đường dẫn trong câu lệnh HQL, từ thực thể này sang thực thể khác. Xem tài liệu Hibernate về HQL và tham gia để biết chi tiết.


32
"Con đường" là gì? Tôi đã tìm kiếm tài liệu HQL nhưng không tìm thấy định nghĩa.
gwg

7
nó có nghĩa là bạn cần liên kết các thực thể: trong ví dụ của anh ấy ở đây ở trên, hãy lưu ý cách anh ấy đặt ug.user u. Nếu không có ug trước nó, bạn sẽ gặp lỗi. Ngoài ra, 'người dùng' trong 'ug.user u' phải là tên của trường trong Class UserGroup!
Lawrence

6
Cú pháp HQL này thật khó chịu. Tôi đã phải tìm rất nhiều ví dụ và tìm thấy của bạn.
Bằng Rikimaru,

Sau đó, tôi không thể "thủ công" tham gia các thực thể mà không có ánh xạ rõ ràng (trường được sử dụng để tham gia) được khai báo với Thực thể?
Ông Anderson

67

Bạn cần đặt tên thực thể chứa liên kết với Người dùng. Ví dụ,

... INNER JOIN ug.user u ...

Đó là "đường dẫn" mà thông báo lỗi đang phàn nàn - đường dẫn từ Nhóm người dùng đến thực thể Người dùng.

Hibernate dựa trên các JOIN khai báo, điều kiện kết hợp được khai báo trong siêu dữ liệu ánh xạ. Đây là lý do tại sao không thể tạo truy vấn SQL gốc mà không có đường dẫn.


13
Cuối cùng ai đó trả lời gốc rễ của vấn đề ... (cần phải thêm tiền tố bảng nước ngoài với bí danh hiện có) đã giải quyết vấn đề của tôi, cảm ơn rất nhiều!
Saad Benbouzid

6
Điều gì sẽ xảy ra nếu: bạn không tạo liên kết trong Thực thể và chỉ lưu một cái gì đó như 'Long userId;'
Spektakulatius
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.