Hibernate HQL for joining non-mapped tables

风格不统一 提交于 2019-12-07 05:23:55

问题


I have an entity called "Kurs":

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

And also an entity called "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....
}

Now I'm building a KursDao that will have a method to fetch a list of Kurs by the kategoriId, but I'm unable to get the join to work for me. Being used to SQL, I would normally think the query should be like this:

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

But this doesn't work and I can't get anything like this to work. I do not want to create a class of the KursKategori since it is only a mapping table anyway. Is there a way to join the non-mapped table KursKategori to the mapped table kurs so that I will only get the Kurs that is in the correct Kategori?


回答1:


In HQL you can only join on mapped relationships between entities. However, you have such a relationship, so that you can use it:

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



回答2:


Since Hibernate 5.1 you can JOIN mapped entities without association.

So, this should work now:

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



回答3:


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

You cannot make HQL query on KursKategori , a table which is not mapped in hibernate..

Either you can run sql query through hibernate template or a query something like this

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



回答4:


You could create a query like this and will work.

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


来源:https://stackoverflow.com/questions/9068829/hibernate-hql-for-joining-non-mapped-tables

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!