2012-01-30 67 views
2

我有一個名爲實體「航向對接」:Hibernate的HQL加盟非映射表

@Entity 
public class Kurs { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long kursId; 
    private String name; 
    //Accessors.... 
} 

而且也被稱爲「駕駛員學校」的實體:

@Entity 
public class Kategori { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long kategoriId; 
    private String name; 

    @ManyToMany(cascade = CascadeType.ALL) 
    @JoinTable (name = "KursKategori", joinColumns = {@JoinColumn(name = "kategoriId")}, inverseJoinColumns = {@JoinColumn(name = "kursId")}) 
    private List<Kurs> kursList; 
    // Accessors.... 
} 

現在即時通訊建設KursDao,即將有一個方法來獲取kategoriId的Kurs列表。但我無法讓加入爲我工作。 使用到SQL我通常會認爲查詢應該是這樣的:

getHibernateTemplate().find("from Kurs as k INNER JOIN KursKategori kk ON k.kursId = kk.kursId AND kk.kategoriId = ?", kategoriId); 

但這並不工作,我不能讓這樣的事情工作。我不想創建一個KursKategori類,因爲它只是一個映射表。 有沒有辦法將非映射表KursKategori連接到映射表kurs,所以我只會得到正確Kategori中的Kurs?

+0

你得到的錯誤是什麼?你的數據庫如何部署? – 2012-01-30 18:30:47

+0

意外標記:在第1行第67列ON [來自no.dahlsdata.model.Kurs.Kurs as k INNER JOIN KursKategori kk ON k.kursId = kk.kursId AND kk.kategoriId =?] – user829237 2012-01-30 18:33:24

+0

它不像我的ON關鍵字。我也嘗試過不同的變化。例如。使用舊式連接(來自kurs k,kurskategori kk,其中kk.kursId = k.kursId和kk.kategoriId =?),但這只是給出kurskategori未映射的錯誤。但我不想映射kurskategori。我只是想加入我的反對。 – user829237 2012-01-30 18:35:21

回答

9
運行SQL查詢

在HQL中,您只能加入實體之間的映射關係。然而,你有這樣的關係,所以你可以使用它:

select kurs from Kategori kat join kat.kursList kurs where kat.kategoriId = ? 
+0

太好了。謝謝哥們!只是我在找:) – user829237 2012-01-30 20:43:15

+1

讓我們假設你想選擇_kat_而不是_kurs_。這意味着您不需要訪問_kurs_表,但生成的sql查詢確實在該表上包含連接。你怎麼能阻止呢?查詢只需要_kat_表和連接表。 – T3rm1 2012-11-09 11:45:48

0
getHibernateTemplate().find("from Kurs as k INNER JOIN KursKategori kk ON k.kursId = kk.kursId AND kk.kategoriId = ?", kategoriId); 

你不能對KursKategori,這是不處於休眠映射表HQL查詢..

要麼你可以通過Hibernate模板或查詢像這樣

select kurs from kategori k join fetch k.kursList where k.kategoriId = ? 
0

你可以創建一個這樣的查詢,並將工作。

from Kurs k, KursKategori kk where k.kursId = kk.kursId AND kk.kategoriId = ?