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