Запрос критериев JPA для компании и количества сотрудников - PullRequest
0 голосов
/ 21 мая 2019

Я использую репозитории JPA. У меня есть таблица Company с отношениями один-ко-многим с таблицей Employee. Я хочу получить список компаний с числом сотрудников, фамилия которых x. Я пытаюсь использовать множественный выбор, но счет не заполняется. Вот что я пытаюсь сделать.

public class CompanyEntity {
    @Id
    private UUID id;

    @Column
    private String name;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "company", orphanRemoval = true)
    private List<EmployeeEntity> employees;

    @Transient
    private Integer employeeCount;
}

...

@Autowired
private CompanyRepository repo;

...

public Page<CompanyEntity> findAllCompanies(Pageable pageable, String lastname) {

    Specification<CompanyEntity> specification = (root, criteriaQuery, criteriaBuilder) -> {
        Join employees = root.join("employees");
        criteriaQuery.groupBy(root);
        criteriaQuery.multiselect(root, criteriaBuilder.count(employees).alias("employeeCount"));

        Predicate predicate = criteriaBuilder.equal(employees.get("lastname"), lastname);
        return predicate;
    };

    Page<EmployeeEntity> page = repo.findAll(specification, pageable);

    return page;
}

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

Я закончил писать запрос на метод репозитория.

@Query("select c, count(e.id) from company c left join employee e on c.id = e.company.id where e.lastname = :lastname group by c.id")
Page<Object[]> findAll(@Param("lastname") String lastname, Pageable pageable);

Здесь Object[0] содержит CompanyEntity, а Object[1] содержит количество как Long.

0 голосов
/ 21 мая 2019

Куда должно идти значение счетчика?

A Specification просто настраивает часть запроса.

Если вы хотите контролировать полный запрос, включая список выбора, выполните реализацию пользовательского метода и используйте EntityManager напрямую.

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