ОШИБКА — обработано новое глобальное исключение! Сообщение = java.util.LinkedHashMap не может быть преобразовано в java.math.BigInteger

#spring-boot #hibernate #spring-data-jpa #hql #jpql

#весенняя загрузка #спящий режим #spring-data-jpa #hql #jpql — файл #jpql

Вопрос:

Тип данных PatientID — это BigInteger в entity Object

 private BigInteger patientId;
  

Код:

     @Override
    public List<ChatRoomHistory> getLastChatDetails(List<String> patientIds) {
    String queryStr = "FROM ChatRoomHistory where type = 'NO' and patientId in :patientIds ORDER BY chatCloseTime DESC";
    TypedQuery<ChatRoomHistory> query = sessionFactory.getObject().getCurrentSession().createQuery(queryStr, ChatRoomHistory.class);
    query.setParameter("patientIds", patientIds);
    return query.getResultList();
}
  

Ошибка

     2020-08-16 19:52:27,939 [http-nio-8080-exec-5:] c.t.c.u.e.GlobalExceptionHandler.handleException:243
                ERROR - new Global exception handled!    Message = java.util.LinkedHashMap cannot be cast to java.math.BigInteger
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to java.math.BigInteger
    at org.hibernate.type.descriptor.java.BigIntegerTypeDescriptor.unwrap(BigIntegerTypeDescriptor.java:19)
    at org.hibernate.type.descriptor.sql.DecimalTypeDescriptor$1.doBind(DecimalTypeDescriptor.java:47)
    at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:74)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:280)
  

Комментарии:

1. Вы отправляете, List<String> для patientIds недействительно, я думаю, вам следует отправить List<BigInteger>

2. Я также пробовал с BigInteger, но получаю ОШИБКУ — обработано новое глобальное исключение! Сообщение = java.util.LinkedHashMap не может быть преобразовано в java.math. BigInteger java.lang. ClassCastException: java.util.LinkedHashMap не может быть преобразован в java.math. BigInteger

Ответ №1:

Как сказано в комментарии, вы не можете передать список строк в качестве параметра, предназначенного для числового поля.

Вы должны объявить свой параметр как

 public List<ChatRoomHistory> getLastChatDetails(List<BigInteger> patientIds)
  

Комментарии:

1. Я пробовал то же самое, но получаю: ОШИБКА — обработано новое глобальное исключение! Сообщение = java.util.LinkedHashMap не может быть преобразовано в java.math. BigInteger java.lang. ClassCastException: java.util.LinkedHashMap не может быть преобразован в java.math. BigInteger

2. Можете ли вы показать весь код? Есть ли какое-нибудь место, где вы объявляете LinkedHashMap ?

3. Список<BigInteger> Идентификаторы пациентов = mapper .readValue(mapper.writeValueAsString(thpResponse.getResponseData()), List.class ); Список<ChatRoomHistory> chatRoomHistory = chatHistoryDAO.getLastChatDetails(идентификаторы пациентов);

4. @Ramanuj это означает, что у вас проблема в json, ваши идентификаторы в managedAccountsUserIds узле. Вы можете проверить, работает ваш запрос или нет, сначала передав некоторый постоянный идентификатор в запросе.

5. @Ramanuj Смотрите здесь подробности onlinegdb.com/SyM2l0LGP

Ответ №2:

Вы можете исправить свой метод таким образом:

 @Override
public List<ChatRoomHistory> getLastChatDetails(List<BigInteger> patientIds)
{
    String hql = "select c from ChatRoomHistory c where c.type = 'NO' and c.patientId in :patientIds ORDER BY c.chatCloseTime DESC";
    TypedQuery<ChatRoomHistory> query = sessionFactory.getCurrentSession().createQuery(hql, ChatRoomHistory.class);
    query.setParameter("patientIds", patientIds);
    return query.getResultList();
}
  

Комментарии:

  1. Даже если HQL не требует наличия a select_clause , обычно хорошей практикой является его включение.

  2. Список значений не должен быть пустым; он должен содержать хотя бы одно значение. (Смотрите это).

Комментарии:

1. Список не пуст: но gettign o-8080-exec-2:] c.t.c.u.e.GlobalExceptionHandler.HandleException: ОШИБКА 243 — обработано новое глобальное исключение! Сообщение = java.util.LinkedHashMap не может быть преобразовано в java.math. BigInteger java.lang. ClassCastException: java.util.LinkedHashMap не может быть преобразован в java.math. BigInteger в org.hibernate.type.descriptor.java.BigIntegerTypeDescriptor.unwrap(BigIntegerTypeDescriptor.java:19)

2. Эта трассировка стека каким-то образом связана с выполнением метода getLastChatDetails ?