Несколько JOIN с FETCH в Criteria API

У меня есть JPQL, который выглядит следующим образом:

SELECT
        DISTINCT b 
    FROM
        Book b 
    INNER JOIN
        FETCH b.volumes as v 
    INNER JOIN
        v.metadata as md 
    WHERE
        b.createdAt IN (
            SELECT
                MAX(book.createdAt) 
            FROM
                Book book 
            WHERE
                book.author = ?1 
        ) 
        AND md.genre IN (
            ?2
        )

Так как он должен генерироваться динамически, мне нужно использовать Criteria API для добавления различных условий. Я могу сделать все правильно, за исключением JOIN, потому что первый - это выборка, и я не могу связать один с другим.

Это то, что я имею до сих пор:

    query.distinct(true);
    final Join<Book, Metadata> Metadata = root.join("volumes").join("metadata");

    final Subquery<LocalDateTime> subquery = query.subquery(LocalDateTime.class);
    final Root<Book> plan = subquery.from(Book.class);
    subquery.where(criteriaBuilder.equal(plan.get("author"), companyId));
    final Expression<LocalDateTime> createdAt = book.get("createdAt");
    subquery.select(criteriaBuilder.greatest(createdAt));

    predicates.add(criteriaBuilder.in(root.get("createdAt")).value(subquery));

    genre.ifPresent(strings -> predicates.add(criteriaBuilder.in(metadata.get("genre")).value(strings)));

    return criteriaBuilder.and(predicates.toArray(new Predicate[0]));

Есть идеи о том, как сделать первое присоединение выборкой?

0
задан Zorrocaesar 27 February 2019 в 14:02
поделиться

1 ответ

Есть метод для этого в классе Root. Без второго параметра это выборка внутреннего соединения

root.fetch("volumes")

0
ответ дан Peter Šály 27 February 2019 в 14:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: