Я создал два объекта в JPA, Листинг и Тип элемента - они существуют в отношениях "многие ко многим" (Hibernate автоматически генерирует соединительную таблицу). Я пытаюсь найти лучший способ создать запрос, который принимает динамический список строк типа элемента и возвращает идентификаторы всех списков, которые соответствуют указанным типам элементов, но я недавно начал в JPA.
В настоящее время я использую JpaRepository для создания относительно простых запросов. Я пытался сделать это с помощью CriteriaQuery, но некоторые близкие, но не совсем ответы, которые я читал в другом месте, похоже, предполагают, что, поскольку это в Spring, это может быть не лучший подход, и что я должен обрабатывать это с помощью сама реализация JpaRepository. Это кажется разумным?
У меня есть запрос, который не чувствуется за миллион миль (на основе пример Баелдунга и моего чтения Викикниги), но для начала я получаю предупреждение о необработанном типе при соединении, не говоря уже о том, что я не уверен, будет ли это run, и я уверен, что есть лучший способ сделать это.
public List<ListingDTO> getListingsByItemType(List<String> itemTypes) {
List<ListingDTO> listings = new ArrayList<>();
CriteriaQuery<Listing> criteriaQuery = criteriaBuilder.createQuery(Listing.class);
Root<Listing> listing = criteriaQuery.from(Listing.class);
//Here Be Warnings. This should be Join<?,?> but what goes in the diamond?
Join itemtype = listing.join("itemtype", JoinType.LEFT);
In<String> inClause = criteriaBuilder.in(itemtype.get("name"));
for (String itemType : itemTypes) {
inClause.value(itemType);
}
criteriaQuery.select(listing).where(inClause);
TypedQuery<Listing> query = entityManager.createQuery(criteriaQuery);
List<Listing> results = query.getResultList();
for (Listing result : results) {
listings.add(convertListingToDto(result));
}
return listings;
}
Я пытаюсь понять, как лучше передать динамический список name (поле в ItemType) и вернуть список уникальных id (PK в листинге), где есть строка, которая соответствует в таблице соединений. Пожалуйста, дайте мне знать, если я могу предоставить какую-либо дополнительную информацию или помощь - у меня сложилось впечатление, что JPA и его обработка динамических запросов, подобных этому, являются частью его хлеба с маслом!




API критериев полезен, когда вам нужно динамически создать запрос на основе различных... критериев.
Все, что вам нужно здесь, это статический запрос JPQL:
select distinct listing from Listing listing
join listing.itemTypes itemType
where itemType.name in :itemTypes
Поскольку вы используете Spring-data-jpa, вам просто нужно определить метод и аннотировать его с помощью @Query в интерфейсе репозитория:
@Query("<the above query>")
List<Listing> findByItemTypes(List<String> itemTypes)
Это выглядит очень многообещающе, большое спасибо за ваш ответ! Я попробую и дам вам знать, как у меня дела. Спасибо еще раз!