Что JPA EntityManager.getSingleResult () возвращает для запроса COUNT? - PullRequest
28 голосов
/ 26 августа 2010

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

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

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

Ответы [ 7 ]

42 голосов
/ 26 августа 2010

Согласно спецификации 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.

13 голосов
/ 23 ноября 2015

Примечание: есть разница между JQPL и Native query

Query query = em.createQuery("SELECT COUNT(p) FROM PersonEntity p " );

query.getSingleResult().getClass().getCanonicalName() -> java.lang.Long

Query query = em.createNativeQuery("SELECT COUNT(*) FROM PERSON " );

query.getSingleResult().getClass().getCanonicalName() -> java.math.BigInteger

10 голосов
/ 27 июля 2016

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

2 голосов
/ 26 августа 2010

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

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

1 голос
/ 11 декабря 2018

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

return query.getSingleResult() != null ? Integer.parseInt(query.getSingleResult().toString()) : 0;
1 голос
/ 26 августа 2010

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

1 голос
/ 26 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...