【问题标题】:ERROR - new Global exception handled! Message = java.util.LinkedHashMap cannot be cast to java.math.BigInteger错误 - 处理了新的全局异常! Message = java.util.LinkedHashMap 无法转换为 java.math.BigInteger
【发布时间】:2020-12-05 20:01:59
【问题描述】:

patientId 的DataType 是实体对象中的BigInteger

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)

【问题讨论】:

  • 您为patientIds 发送的List&lt;String&gt; 无效我认为您应该发送List&lt;BigInteger&gt;
  • 我也尝试过使用 BigInteger,但得到 ERROR - 处理了新的全局异常! Message = java.util.LinkedHashMap 无法转换为 java.math.BigInteger java.lang.ClassCastException: java.util.LinkedHashMap 无法转换为 java.math.BigInteger

标签: spring-boot hibernate spring-data-jpa hql jpql


【解决方案1】:

正如评论中所说,您不能将字符串列表作为用于数字字段的参数传递。

你应该将你的参数声明为

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

【讨论】:

  • 我尝试了同样的方法,但得到:错误 - 处理了新的全局异常! Message = java.util.LinkedHashMap 无法转换为 java.math.BigInteger java.lang.ClassCastException: java.util.LinkedHashMap 无法转换为 java.math.BigInteger
  • 你能展示整个代码吗?有没有你声明 LinkedHashMap 的地方?
  • List patientIds = mapper .readValue(mapper.writeValueAsString(thpResponse.getResponseData()), List.class); List chatRoomHistory = chatHistoryDAO.getLastChatDetails(patientIds);
  • @Ramanuj 这意味着您在 json 中存在问题,您的 id 在 managedAccountsUserIds node 中。您可以通过首先在查询中传递一些常量 id 来检查您的查询是否有效。
  • @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 不需要存在 select_clause,但包含一个 generally good practice

  2. 值列表不能为空;它必须至少包含一个值。(参见this)。

【讨论】:

  • 列表不为空:但是 gettign o-8080-exec-2:] c.t.c.u.e.GlobalExceptionHandler.handleException:243 错误 - 处理了新的全局异常! Message = java.util.LinkedHashMap 无法转换为 java.math.BigInteger java.lang.ClassCastException:java.util.LinkedHashMap 无法转换为 org.hibernate.type.descriptor.java.BigIntegerTypeDescriptor.unwrap 的 java.math.BigInteger (BigIntegerTypeDescriptor.java:19)
  • 这个堆栈跟踪是否与方法getLastChatDetails执行有某种相关
猜你喜欢
  • 1970-01-01
  • 2019-02-27
  • 2016-11-03
  • 2018-06-10
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多