在 Spring JPA 规范的连接子句上使用 "having"
Using "having" on join clause of Spring JPA specification
我有一个 User
的存储库;每个 User
与 Post
的集合具有 OneToMany 关系。
我如何根据用户使用 JPA 规范的帖子数量过滤(和分页)用户存储库?
我最初的尝试是这样的:
public static Specification<User> receiptNumberGreaterThanOrEqualTo(int numberToFilterBy) {
return (users, query, cb) -> greaterThanOrEqualTo(cb.count(users.get("posts")), Long.valueOf(numberToFilterBy));
}
然而,这导致了一个错误:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')>=9 limit 100'
这是因为@OneToMany 连接期望使用 HAVING
子句而不是 WHERE
,即 select * from users outer left join posts on users.id = posts.id having(count(posts) > someNumber) where user.id = "some-id"
对比
select * from users outer left join posts on users.id = posts.id where user.id = "something" and count(posts) > someNumber;
我可以通过在用户和帖子之间创建连接来生成带有 having 关键字的查询,然后执行以下操作:
query.having(cb.greaterThanOrEqualTo(cb.count(joinOfPosts), Long.valueOf(numberToFilterBy)))
,但它的类型是 CriteriaQuery
,我不确定如何将其变成规范。
我通过在 criteriaBuilder 上使用 size() 方法解决了这个问题,
即
(users, query, criteriaBuilder) -> criteriaBuilder.greaterThanOrEqualTo(criteriaBuilder.size(users.get("posts")), numberToFilterBy);
我有一个 User
的存储库;每个 User
与 Post
的集合具有 OneToMany 关系。
我如何根据用户使用 JPA 规范的帖子数量过滤(和分页)用户存储库?
我最初的尝试是这样的:
public static Specification<User> receiptNumberGreaterThanOrEqualTo(int numberToFilterBy) {
return (users, query, cb) -> greaterThanOrEqualTo(cb.count(users.get("posts")), Long.valueOf(numberToFilterBy));
}
然而,这导致了一个错误:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')>=9 limit 100'
这是因为@OneToMany 连接期望使用 HAVING
子句而不是 WHERE
,即 select * from users outer left join posts on users.id = posts.id having(count(posts) > someNumber) where user.id = "some-id"
对比
select * from users outer left join posts on users.id = posts.id where user.id = "something" and count(posts) > someNumber;
我可以通过在用户和帖子之间创建连接来生成带有 having 关键字的查询,然后执行以下操作:
query.having(cb.greaterThanOrEqualTo(cb.count(joinOfPosts), Long.valueOf(numberToFilterBy)))
,但它的类型是 CriteriaQuery
,我不确定如何将其变成规范。
我通过在 criteriaBuilder 上使用 size() 方法解决了这个问题,
即
(users, query, criteriaBuilder) -> criteriaBuilder.greaterThanOrEqualTo(criteriaBuilder.size(users.get("posts")), numberToFilterBy);