HQL ERROR: เส้นทางที่คาดไว้สำหรับการเข้าร่วม


100

ฉันลองใช้คำค้นหานี้ในรูปแบบต่างๆและดูเหมือนจะไม่สามารถทำให้เกิดขึ้นได้ ฉันยังอ้างถึงโพสต์นี้ด้วย: เส้นทางที่คาดหวังสำหรับเข้าร่วม! Nhibernate Errorและดูเหมือนจะใช้ตรรกะเดียวกันกับแบบสอบถามของฉันไม่ได้ UserวัตถุของฉันมีUserGroupคอลเล็กชัน

ฉันเข้าใจว่าแบบสอบถามจำเป็นต้องอ้างอิงเอนทิตีภายในออบเจ็กต์ แต่จากสิ่งที่ฉันเห็นฉัน ...

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

คำตอบ:


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

เป็นแบบสอบถามที่มีชื่อ:

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

ใช้เส้นทางในคำสั่ง HQL จากเอนทิตีหนึ่งไปยังอีกเอนทิตี ดูเอกสาร Hibernate บน HQL และเข้าร่วมเพื่อดูรายละเอียด


33
"เส้นทาง" คืออะไร? ฉันค้นหาเอกสาร HQL แต่ไม่พบคำจำกัดความ
gwg

7
หมายความว่าคุณต้องเชื่อมโยงเอนทิตี: ในตัวอย่างของเขาที่นี่ด้านบนสังเกตว่าเขาวาง ug.user u อย่างไร หากไม่มี ug ก่อนหน้านี้คุณจะได้รับข้อผิดพลาดนอกจากนี้ 'user' ใน 'ug.user u' ควรเป็นชื่อของฟิลด์ใน Class UserGroup!
Lawrence

6
ไวยากรณ์ HQL นี้น่ารำคาญ ฉันต้องหาตัวอย่างมากมายและพบว่าของคุณ
Bằng Rikimaru

ถ้าอย่างนั้นฉันไม่สามารถเข้าร่วมเอนทิตี "ด้วยตนเอง" โดยไม่มีการแมปอย่างชัดเจน (ฟิลด์ที่จะใช้ในการเข้าร่วม) ที่ประกาศด้วยเอนทิตีได้หรือไม่
Mr. Anderson

68

คุณต้องตั้งชื่อเอนทิตีที่มีการเชื่อมโยงกับผู้ใช้ ตัวอย่างเช่น,

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

นั่นคือ "เส้นทาง" ที่ข้อความแสดงข้อผิดพลาดกำลังบ่น - เส้นทางจาก UserGroup ไปยังเอนทิตีผู้ใช้

ไฮเบอร์เนตอาศัย JOIN ที่ประกาศซึ่งเงื่อนไขการรวมถูกประกาศในเมทาดาทาการแมป ด้วยเหตุนี้จึงเป็นไปไม่ได้ที่จะสร้างแบบสอบถาม SQL ดั้งเดิมโดยไม่ต้องมีเส้นทาง


13
ในที่สุดก็มีคนตอบรากของปัญหา ... (จำเป็นต้องนำหน้าตารางต่างประเทศด้วยนามแฝงที่มีอยู่) แก้ไขปัญหาของฉันได้ขอบคุณมาก!
Saad Benbouzid

6
จะเกิดอะไรขึ้นถ้าคุณไม่ได้ทำการเชื่อมโยงในเอนทิตีและเพิ่งบันทึกบางอย่างเช่น 'Long userId;'
Spektakulatius
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.