Как составить JPQL-запрос для получение отсортированного списка сущностей из другой сущности, с которой есть связь ManyToMany?

Есть две сущности:

@Entity
public class A {
    
    @Id
    Integer id;

    @ManyToMany
    @JoinTable(
            name = "a_b",
            joinColumns = @JoinColumn(name = "a_id"),
            inverseJoinColumns = @JoinColumn(name = "b_id")
    )
    @OrderBy("name")
    Set<B> bs;
    
}
@Entity
public class B {
    
    @Id
    Integer id;

    String name;
    
}

Я хочу получить список сущностей B, которые привязаны к сущности A. Вообще, обычно это делается довольно легко:

SELECT a.bs FROM A a WHERE a.id=:id

но проблема в том, что мне ещё нужна сортировка сущностей B в списке результатов. Вот такой код работать не будет:

SELECT a.bs FROM A a WHERE a.id=:id ORDER BY a.bs.name ASC

потому что нельзя получить свойство сущности при обращении к списку сущностей (единственное доступное свойство у a.bs - это size). Проблема осложняется ещё и тем, что в классе B нет поля A, а поэтому я не могу сделать вот так:

SELECT b FROM B b WHERE b.a.id=:id

Итак. Надо получить отсортированный список сущностей B по id сущности A. Я составил такой JPQL-запрос:

SELECT a.bs AS b FROM A a WHERE a.id=:id ORDER BY b.name ASC

Но при компиляции возникает ошибка:

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Invalid path: 'b.name'

хотя при редактировании кода IDEA ошибок не показывала.

Как мне следует изменить запрос, чтобы получить отсортированный список сущностей B?


Ответы (1 шт):

Автор решения: Zhenyria

Мою задачу решает предложенный @Sergey Mitrofanov запрос:

SELECT b FROM A a JOIN a.bs b WHERE a.id=:id ORDER BY b.name
→ Ссылка