Используйте Hibernate createNativeQuery с TypedQuery для Integer.class - PullRequest
0 голосов
/ 12 февраля 2019

Я хочу использовать Hibernate TypedQuery для NativeQuery с аргументом Integer.class.Возможно ли это?

NativeQuery<Integer> query = session.createNativeQuery("select 1 from dual", Integer.class);
query.list(); //<--Error.  Caused by: org.hibernate.MappingException: Unknown entity: java.lang.Integer

или

query.getResultList(); //<--Error. Caused by: org.hibernate.MappingException: Unknown entity: java.lang.Integer

или

query.getSingleResult(); //<--Error. Caused by: org.hibernate.MappingException: Unknown entity: java.lang.Integer

В Интернете я нашел несколько примеров, которые предполагают, что это теоретически возможно.

см. GetTaskCount ()

Обновление 1: Я обновил пример.

Обновление 2: Добавить пример getSingleResult ().

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Параметр resultClass принимает только классы сущностей.

Кроме того, при использовании собственных запросов вам никогда не гарантируется, какой будет тип возвращаемого значения для чисел, поэтому использование Integer или Long в типопередаче будет часто взрываться.на вас, когда это java.math.BigInteger.

Что вам нужно сделать, это:

Query query = em.createNativeQuery("select 1 from dual");  
Number nval = (Number) query.getSingleResult(); 
Integer val = nval == null ? null : nval.intValue();

Или для списка:

Query query = em.createNativeQuery("select 1 from dual");
List<Number> l = (List<Number>) query.getResultList();
for (Number nval : l) {
    Integer val = nval == null ? null : nval.intValue();
    // do stuff
}
0 голосов
/ 12 февраля 2019

Второй параметр createNativeQuery () должен быть сопоставленной сущностью.Целое число нет.Итак, вы должны сделать:

Query query = em.createNativeQuery("select 1 from dual");  
Integer val = (Integer) query.getSingleResult(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...