【问题标题】:JPA criteria query for company and its employee count公司及其员工人数的 JPA 标准查询
【发布时间】:2019-10-07 08:57:27
【问题描述】:

我正在使用 JPA 存储库。我有一个与 Employee 表具有一对多关系的 Company 表。我想获取姓氏为 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;
}

【问题讨论】:

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


    【解决方案1】:

    计数值应该去哪里?

    Specification 只是配置查询的 where 部分。

    如果您想控制包括选择列表在内的完整查询,请执行custom method implementation 并直接使用EntityManager

    【讨论】:

    • 我以为上面代码中的multiselect会选择count。
    【解决方案2】:

    我最终写了一个关于存储库方法的查询。

    @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] 包含CompanyEntityObject[1] 包含计数为Long

    【讨论】:

      猜你喜欢
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      相关资源
      最近更新 更多