Hibernate HQL用于连接非映射表

时间:2012-01-30 18:27:06

标签: hibernate hql

我有一个名为“Kurs”的实体:

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

还有一个名为“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....
}

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

kategoriId

但是这不起作用,我无法得到这样的东西。我不想创建getHibernateTemplate().find("from Kurs as k INNER JOIN KursKategori kk ON k.kursId = kk.kursId AND kk.kategoriId = ?", kategoriId); 的类,因为它只是一个映射表。 有没有办法将非映射表KursKategori加入映射表KursKategori,这样我才能得到正确的kurs中的Kurs

3 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:0)

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

你不能在KursKategori上进行HQL查询,这是一个没有在hibernate中映射的表。

你可以通过hibernate模板运行sql查询或者像这样的查询

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

答案 2 :(得分:0)

Since Hibernate 5.1您可以加入映射实体,不需要关联。

所以,现在应该可以了:

SELECT k from Kurs as k 
    JOIN KursKategori kk ON k.kursId = kk.kursId AND kk.kategoriId = ?