Подтвердить что ты не робот

Что возвращает JPA EntityManager.getSingleResult() для запроса COUNT?

Что возвращает EntityManager.getSingleResult() для запроса COUNT?

Итак, каков точный тип времени выполнения foo?

Object foo = em.createQuery("SELECT COUNT(t) FROM com.company.Thing t WHERE prop = :param")
       .setParameter("param", value).getSingleResult();
4b9b3361

Ответ 1

COUNT (t) специально возвращает java.lang.Long. Когда он появляется сам по себе в этом контексте, он возвращается как есть.

(В других контекстах Long, сгенерированный COUNT, может быть завернут, но не сегодня.)

Ответ 2

Согласно спецификации JPA, COUNT возвращает Long:

4.8.4 Агрегатные функции в предложении SELECT Результат запроса

может быть результатом применения агрегатной функции к выражению пути.

В предложении SELECT запроса могут использоваться следующие агрегатные функции: AVG, COUNT, MAX, MIN, SUM.

Для всех агрегатных функций, кроме COUNT, выражение пути, являющееся аргументом для агрегатной функции, должно заканчиваться в поле состояния. Аргумент выражения пути к COUNT может заканчиваться либо полем состояния, либо полем ассоциации, либо аргумент COUNT может быть переменной идентификации.

Аргументы функций SUM и AVG должны быть числовыми. Аргументы функций MAX и MIN должны соответствовать упорядочиваемым типам полей состояния (т.е. Числовым типам, строковым типам, типам символов или типам дат).

Тип Java, содержащийся в результате запроса с использованием статистической функции, выглядит следующим образом:

  • COUNT возвращает Long.
  • MAX, MIN возвращают тип поля состояния, к которому они применяются.
  • AVG возвращает Double.
  • SUM возвращает Long при применении к полям состояний целочисленных типов (кроме BigInteger); Двойной при применении к полям состояний типов с плавающей точкой; BigInteger применительно к полям состояний типа BigInteger; и BigDecimal при применении к полям состояний типа BigDecimal.

Если используется SUM, AVG, MAX или MIN, и нет значений, к которым может быть применена агрегатная функция, результатом агрегатной функции будет NULL.

Если используется COUNT, и нет значений, к которым можно применить COUNT, результат статистической функции будет равен 0.

Аргументу агрегатной функции может предшествовать ключевое слово DISTINCT, чтобы указать, что повторяющиеся значения должны быть удалены до применения агрегатной функции.

Нулевые значения удаляются до применения агрегатной функции независимо от того, указано ли ключевое слово DISTINCT.

Ответ 3

NB: существует разница между JQPL и Нативный запрос

Запрос запроса = em. createQuery ( "SELECT COUNT (p) FROM PersonEntity p" );

query.getSingleResult(). getClass(). getCanonicalName() → java.lang.Long

Запрос запроса = em. createNativeQuery ( "SELECT COUNT (*) FROM PERSON" );

query.getSingleResult(). getClass(). getCanonicalName() → java.math.BigInteger

Ответ 4

Собственные запросы могут возвращать разные объекты для COUNT на основе драйвера базы данных; однако все эти объекты расширяют java.lang.Number, который реализует метод longValue().

Ответ 5

Очевидно, что число, которое является счетчиком из запроса:) Его тип по спецификации Long.

Ответ 6

Функция AFAIK COUNT возвращает Long

Ответ 7

Вы можете вернуть непосредственно целое число, а не длинное.

return query.getSingleResult() != null ? Integer.parseInt(query.getSingleResult().toString()) : 0;