【问题标题】:Using "having" on join clause of Spring JPA specification在 Spring JPA 规范的连接子句中使用“有”
【发布时间】:2018-10-19 13:11:38
【问题描述】:

我有一个Users 的存储库;每个User 都与Posts 的集合具有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) &gt; someNumber) where user.id = "some-id"
vs
select * from users outer left join posts on users.id = posts.id where user.id = "something" and count(posts) &gt; someNumber;

我可以通过在用户和帖子之间创建连接来生成带有关键字的查询,然后执行以下操作: query.having(cb.greaterThanOrEqualTo(cb.count(joinOfPosts), Long.valueOf(numberToFilterBy))),但它的类型是 CriteriaQuery,我不确定如何将其转换为规范。

【问题讨论】:

    标签: spring hibernate spring-data-jpa jpql specifications


    【解决方案1】:

    我通过使用 criteriaBuilder 上的 size() 方法解决了这个问题,

    即。

    (users, query, criteriaBuilder) -> criteriaBuilder.greaterThanOrEqualTo(criteriaBuilder.size(users.get("posts")), numberToFilterBy);
    

    【讨论】:

      猜你喜欢
      • 2017-05-12
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      • 2018-07-22
      相关资源
      最近更新 更多