【问题标题】:Multiple JOIN with FETCH in Criteria API在 Criteria API 中使用 FETCH 进行多次 JOIN
【发布时间】:2019-02-27 14:02:45
【问题描述】:

我有一个看起来像这样的 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 之外,我什么都可以搞定,因为第一个是 fetch,我无法将那个与下一个链接起来。

这是我目前所拥有的:

    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]));

关于如何使第一个加入获取的任何想法?

【问题讨论】:

    标签: jpa spring-data-jpa spring-data criteria-api


    【解决方案1】:

    在 Root 类中有一个方法。没有第二个参数就是内连接获取

    root.fetch("volumes")

    【讨论】:

      猜你喜欢
      • 2015-09-16
      • 1970-01-01
      • 2019-07-17
      • 1970-01-01
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      • 2021-02-24
      • 2021-12-22
      相关资源
      最近更新 更多