Spring数据:如何创建仅返回@ManyToMany. size()属性中大于5的行的存储库查询

mklgxw1f  于 2022-12-26  发布在  Spring
关注(0)|答案(1)|浏览(92)

考虑以下实体

@Entity
public class Team {

    private String title;

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "teams")
    @OrderBy("firstName ASC")
    private Set<User> users = new HashSet<>();
}

我想创建一个存储库findBy查询,它返回team的所有条目,users.count()大于5。
我期望的SQL是:

SELECT t.title, count(*) as total_users FROM team t 
LEFT JOIN team_users tu on t.id=tu.team_id  
GROUP BY t.id HAVING total_users > 5;

从我的研究来看,有几种方法可以做到这一点,但我想不出其中任何一种。

  1. Jpa规范执行者
  2. @query /本机查询
    1.命名本机查询
cxfofazt

cxfofazt1#

JpaSpecificationExecutor为例,需要存储库接口来实现它。通常,存储库也应该是一个接口
JpaSpecificationExecutor接口提供了几个方法,我们将以findAll为例

Specification<DemoEntity> sp = (root, query, cb) -> {
        // where begin
        Predicate fp = cb.conjunction();
        // xxx = 'some value'
        Predicate p1 = cb.equal(root.get("xxx").as(String.class), "some Value");
        // Add to the where
        fp = cb.and(fp, p1);
        Predicate gt = cb.gt(root.get("yyy").as(Integer.class), 5);
        // Finally
        return query.where(fp).groupBy(root.get("xxx")).having(gt).getRestriction();

};

相关问题