HQL ERROR: Path diharapkan untuk bergabung

100

Saya terus mencoba variasi dari kueri ini dan sepertinya tidak dapat mewujudkannya. Saya juga mereferensikan posting ini: Jalur yang Diharapkan untuk Bergabung! Kesalahan Nhibernate dan sepertinya tidak dapat menerapkan logika yang sama ke kueri saya. UserObjek saya memiliki UserGroupkoleksi.

Saya memahami bahwa kueri perlu merujuk entitas di dalam objek, tetapi dari apa yang saya lihat, saya ...

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

Jawaban:

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

Sebagai kueri bernama:

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

Gunakan jalur dalam pernyataan HQL, dari satu entitas ke entitas lainnya. Lihat dokumentasi Hibernate di HQL dan bergabung untuk detailnya.

JB Nizet
sumber
32
Apa itu "jalan"? Saya mencari dokumentasi HQL tetapi tidak menemukan definisi.
gwg
7
itu berarti Anda perlu menautkan entitas: dalam contoh di sini di atas, perhatikan bagaimana dia menempatkan ug.user u. Tanpa ug sebelumnya, Anda akan mendapatkan error. Juga, 'user' di 'ug.user u' harus menjadi nama field di Class UserGroup!
Lawrence
6
Sintaks HQL ini mengganggu. Saya harus menemukan banyak contoh dan menemukan contoh Anda.
Bằng Rikimaru
Maka saya tidak dapat menggabungkan entitas "secara manual" tanpa pemetaan eksplisit (bidang yang akan digunakan untuk bergabung) yang dideklarasikan dengan Entitas?
Tn. Anderson
67

Anda perlu memberi nama entitas yang memegang asosiasi ke Pengguna. Sebagai contoh,

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

Itulah "jalur" yang dikeluhkan oleh pesan kesalahan - jalur dari UserGroup ke entitas Pengguna.

Hibernate bergantung pada deklaratif JOIN, yang kondisi penggabungannya dinyatakan dalam metadata pemetaan. Inilah sebabnya mengapa tidak mungkin membuat kueri SQL asli tanpa jalur.

Marko Topolnik
sumber
13
Akhirnya seseorang menjawab akar masalah ... (kebutuhan untuk mengawali tabel asing dengan alias yang ada) memecahkan masalah saya, terima kasih banyak!
Saad Benbouzid
6
Bagaimana jika: Anda tidak membuat asosiasi dalam Entitas dan hanya menyimpan sesuatu seperti 'Long userId;'
Spektakulatius