Использование «имеющего» в соединении предложения Spring JPA спецификации - PullRequest
0 голосов
/ 09 мая 2018

У меня есть хранилище 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, и я не уверен, как превратить это в спецификацию.

1 Ответ

0 голосов
/ 09 мая 2018

Я решил это, используя метод size () для критерия Builder,

т.

(users, query, criteriaBuilder) -> criteriaBuilder.greaterThanOrEqualTo(criteriaBuilder.size(users.get("posts")), numberToFilterBy);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...