Оставить Присоединиться к коллекции элементов с помощью JPQL - PullRequest
0 голосов
/ 19 февраля 2019

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

@Entity
class Laptop {
 @Id
 String userId;
 @Column
 String name;
 ...
}

@Entity
class Foo {
 ...

 @Column
 @ElementCollection
 List<String> idsPointingToAnEntity;

 ...
}

Учитывая, что у меня есть класс Foo, который имеет атрибут idsPointingToAnEntity, я мог бы хранить тамсписок идентификаторов ноутбуков или любых идентификаторов строки.Допустим, у Foo есть idsPointingToAnEntity = [1,2,3], у этого [1,2,3] есть эквивалентная запись ноутбука в базе данных.

Как я могу присоединиться / присоединиться к ним с упорядочением вJPQL такой, что в результате получается список Foo, отсортированный по именам ноутбуков.

Теоретически я думаю, что-то вроде этого.

Select f From Foo f LEFT JOIN Laptop l ON l.id IN f.idsPoitingToAnEntity ORDER by l.name

Но этос ошибкой, поскольку f.idsPoitingToAnEntity является таблицей присоединения.

Примечание: idsPointingToAnEntity также может быть другой сущностью, поэтому List<Laptop> не является опцией

Ответы [ 3 ]

0 голосов
/ 03 марта 2019

Если вы используете JPA 2.1 или выше, вы используете JOIN ON в JPQL для несвязанных сущностей.Сначала присоединитесь к таблице идентификаторов, например:

select f from Foo f 
join f.idsPointingToAnEntity id 
join Laptop l ON id=l.id
join AnotherEntity a ON id=a.id
0 голосов
/ 04 марта 2019

Короткий ответ здесь просто не делай этого.Это неправильно использует определенную функцию и может привести к неприятностям по мере роста вашего списка.У вас нет веских оснований для этого.Если вы думаете, что список небольшой, тогда загрузка базы данных минимальна, и нет никаких причин помещать ссылки в ElementCollection.Если список становится большим, вы определенно не хотите ElementCollection.

Ссылка Разница между @OneToMany и @ElementCollection? .ElementCollection предназначен для создания OneToMany между, в вашем случае, Foo и idsPointingToAnEntity.Он определенно не предназначен для использования в качестве отношения «один ко многим» с таблицей соединений .

0 голосов
/ 27 февраля 2019

Вы не можете использовать соединения для получения этого результата:

SELECT l FROM Laptop l, Foo f
WHERE l.id IN f.idsPointingToAnEntity ORDER BY l.name

Или использовать CROSS JOIN, особый вид объединения, не требующий каких-либо условий соответствия:

SELECT l FROM Laptop l
CROSS JOIN Foo f
WHERE l.id IN f.idsPointingToAnEntity ORDER BY l.name

PS: проблема использования перекрестного соединения в этом сценарии заключается в том, что он генерирует декартово произведение , а не все строки с левой стороны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...