Отображение оператора IN «многие ко многим» в JPA (Spring Boot) - PullRequest
0 голосов
/ 16 июня 2019

Я создал две сущности в JPA, Listing и ItemType - они существуют в отношении многие-ко-многим (Hibernate автоматически создает таблицу соединений).Я пытаюсь найти лучший способ создать запрос, который принимает динамический список строк типа элемента и возвращает идентификаторы всех списков, которые соответствуют указанным типам элементов, но я недавно инициировал в JPA.

В настоящее время я использую JpaRepository для создания относительно простых запросов.Я пытался сделать это с помощью CriteriaQuery, но некоторые близкие, но не совсем ответы, которые я читал в другом месте, по-видимому, предполагают, что, поскольку это весной, это может быть не самый лучший подход, и что я должен справиться с этим, используясама реализация JpaRepository.Это кажется разумным?

У меня есть запрос, который не чувствует себя в миллионах миль (на основе примера Baeldung и моего прочтения на WikiBooks ), но для началаЯ получаю предупреждение о необработанном типе при присоединении, не говоря уже о том, что я не уверен, что это произойдет, и я уверен, что есть лучший способ сделать это.

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 s (поле в ItemType) и вернуть список уникальных id s (PK в листинге), где есть строка, которая соответствует в таблице соединений.Пожалуйста, дайте мне знать, если я смогу предоставить какую-либо дополнительную информацию или помощь - у меня возникло ощущение, что JPA и его обработка динамических запросов, подобных этому, являются частью его хлеба с маслом!

1 Ответ

2 голосов
/ 16 июня 2019

Критерий 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...