Как узнать размер результата запроса в JPA?

229
31 августа 2017, 18:15

Что-то совсем запутался с этим JPA(( Есть запрос

    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Movie> movieCriteria = entityManager.getCriteriaBuilder().createQuery(Movie.class);
    Root<Movie> movieRoot = movieCriteria.from(Movie.class);
    movieCriteria.select(movieRoot);
    movieCriteria.distinct(true);
    Join<Movie, Country> countriesJoin = movieRoot.join(Movie_.country);
    Join<Movie, Genre> genresJoin = movieRoot.join(Movie_.genre);
    movieCriteria.where(cb.equal(genresJoin.get(Genre_.id), genreId), cb.equal(countriesJoin.get(Country_.id), countryId));
    movieCriteria.orderBy(cb.asc(movieRoot.get(sort)));

Как можно грамотно получить размер результата?

Пытался добавить в конце

    CriteriaQuery<Long> cq = cb.createQuery(Long.class);
    Root<Movie> mw = cq.from(movieCriteria.getResultType());
    cq.select(cb.count(mw));
    return entityManager.createQuery(cq).getSingleResult();

Но возвращается вся таблица(

Answer 1

Насколько я понял Вы хотите получить количество строк по условию?

Можно внести исправления в первый запрос:

//заменяем тип
CriteriaQuery<Long> movieCriteria = cb.createQuery(Long.class);
...
//получаем count
movieCriteria.select(cb.count(movieRoot));
...
//убираем orderBy
...
//получаем результат
Long count = entityManager.createQuery(movieCriteria).getSingleResult();

Либо дополнить второй условиями:

cq.where(.... //аналогично с join-ами

Если требуется как подсчет количества записей, так и выборка, и при этом нужно избежать дублирования кода, то можно вынести общую часть (создание условий и связей) в отдельные методы.

cq.where(createMovieConditions(movieRoot));
READ ALSO
IF между строками JAVA [дубликат]

IF между строками JAVA [дубликат]

На данный вопрос уже ответили:

221
Наложение скобок [дубликат]

Наложение скобок [дубликат]

На данный вопрос уже ответили:

383
Java JDBC &gt; Не возвращается результат для SQL запросов с переменными типа TABLE

Java JDBC > Не возвращается результат для SQL запросов с переменными типа TABLE

Выполняю SQL запросы через JDBCЕсли запрос содержит переменную типа TABLE, то результат не возвращается:

393
replaceAll - не удаляется подстрока

replaceAll - не удаляется подстрока

Нужно из строки "Привет, как дела? (siteru)" удалить подстроку (site

235