Отображение оператора IN «многие ко многим» в JPA (Spring Boot)

Я создал два объекта в 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 и его обработка динамических запросов, подобных этому, являются частью его хлеба с маслом!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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)

Это выглядит очень многообещающе, большое спасибо за ваш ответ! Я попробую и дам вам знать, как у меня дела. Спасибо еще раз!

matgr 16.06.2019 15:57

Другие вопросы по теме