Hibernate HQL для объединения не отображенных таблиц - PullRequest
5 голосов
/ 30 января 2012

У меня есть сущность под названием "Курс":

@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 по kategoriId, но я не могу заставить объединение работать на меня. Будучи привыкшим к SQL, я обычно думаю, что запрос должен выглядеть следующим образом:

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

Но это не работает, и я не могу заставить что-то подобное работать. Я не хочу создавать класс KursKategori, так как в любом случае это только таблица сопоставления. Есть ли способ присоединить не сопоставленную таблицу KursKategori к сопоставленной таблице kurs, чтобы я мог получить только Kurs, который находится в правильном Kategori?

Ответы [ 4 ]

10 голосов
/ 30 января 2012

В HQL вы можете присоединиться только к отображенным отношениям между сущностями. Тем не менее, у вас есть такие отношения, так что вы можете использовать их:

select kurs from Kategori kat join kat.kursList kurs where kat.kategoriId = ?
1 голос
/ 20 мая 2018

Начиная с Hibernate 5.1 , вы можете присоединиться к сопоставленным сущностям без ассоциации.

Итак, теперь это должно работать:

SELECT k from Kurs as k 
    JOIN KursKategori kk ON k.kursId = kk.kursId AND kk.kategoriId = ?
0 голосов
/ 10 сентября 2012

Вы можете создать такой запрос, и он будет работать.

from Kurs k, KursKategori kk where k.kursId = kk.kursId AND kk.kategoriId = ?
0 голосов
/ 30 января 2012
getHibernateTemplate().find("from Kurs as k INNER JOIN KursKategori kk ON k.kursId = kk.kursId AND kk.kategoriId = ?", kategoriId);

Вы не можете сделать HQL-запрос на KursKategori, таблице, которая не отображается в hibernate ..

Либо вы можете запустить sql-запрос через шаблон гибернации, либо запрос наподобие этого

select kurs from kategori k join fetch k.kursList where k.kategoriId = ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...