У меня есть хранилище User
с; каждый User
имеет отношение OneToMany с коллекцией Post
s.
Как я могу отфильтровать (и выполнить страницу) хранилище пользователей по количеству сообщений, которые они имеют, используя спецификации 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;
Я могу сгенерировать запрос с ключевым словом Имея, создав соединение между пользователем и сообщениями, а затем сделав следующее:
query.having(cb.greaterThanOrEqualTo(cb.count(joinOfPosts), Long.valueOf(numberToFilterBy)))
, но это тип CriteriaQuery
, и я не уверен, как превратить это в спецификацию.