Конструкция JPA CriteriaBuilder из root генерирует только идентификатор выбора - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть следующие объекты

class AuthorEntity {

   @Id
   private int id;
   @OneToMany(mappedBy = "author")
   private Set<BookToAuthorEntity> books

// other fields
}

class BootToAuthorEntity { 

  @Id
  private int id;
  @JoinColumn(name = "author_id")
  @ManyToOne
  private AuthorEntity author;

  // other fields
}

Я пытаюсь сделать следующий запрос с Criteria API

SELECT new AuthorProjection(author, count(books)) FROM AuthorEntity author
  LEFT JOIN author.books books
  GROUP BY author.id

класс проекции

@AllArgsConstructor
class AuthorProjection { 
   private final AuthorEntity author;
   private final long numberOfBooks;
}

Наконец :) Вот запрос через Criteria API

    final CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    final CriteriaQuery<AuthorProjection> query = cb.createQuery(AuthorProjection.class);
    final Root<AuthorEntity> root = query.from(AuthorEntity.class);

    Join<AuthorEntity, BookAuthorEntity> join = root.join(AuthorEntity_.books, JoinType.LEFT);
    query.groupBy(root.get(AuthorEntity_.id));
    query.select(cb.construct(
        AuthorProjection.class,
        root,                 <<<--- note this. I select author as a root
        cb.count(join)
    ));

    return entityManager.createQuery(query).getResultList();

Мне нужно сделать это через Criterial API, потому что я добавлю динамическое предложение c where позже

По какой-то причине запрос через Criteria API генерирует следующий запрос

select
        authorenti0_.id as col_0_0_,
        count(booktoauth1_.id) as col_1_0_ 
    from
        author authorenti0_ 
    left outer join
        authors_to_book booktoauth1_ 
            on authorenti0_.id=booktoauth1_.author_id 
    group by
        authorenti0_.id

и несколько select * from author where id = ? для каждого выбранного автора, что выглядит как проблема n + 1

Кто-нибудь знает, почему это происходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...