Hibernate HQL用于连接非映射表

use*_*237 5 hibernate hql

我有一个名为"Kurs"的实体:

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

还有一个名为"Kategori"的实体:

@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....
}
Run Code Online (Sandbox Code Playgroud)

现在我正在构建一个KursDao,它将有一个方法来获取kategoriId的Kurs列表.但我无法让联盟为我工作.习惯于SQL我通常会认为查询应该是这样的:

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

但这不起作用,我不能得到这样的东西工作.我不想创建一个KursKategori类,因为它只是一个映射表.有没有办法将非映射表KursKategori连接到映射表kurs所以我只会得到正确的Kategori中的Kurs?

axt*_*avt 11

在HQL中,您只能加入实体之间的映射关系.但是,你有这样的关系,所以你可以使用它:

select kurs from Kategori kat join kat.kursList kurs where kat.kategoriId = ?
Run Code Online (Sandbox Code Playgroud)


Dhe*_*rik 6

从 Hibernate 5.1 开始,您可以 JOIN 映射实体而无需关联。

所以,现在应该可以了:

SELECT k from Kurs as k 
    JOIN KursKategori kk ON k.kursId = kk.kursId AND kk.kategoriId = ?
Run Code Online (Sandbox Code Playgroud)