当前位置: 首页 > 知识库问答 >
问题:

参数值与预期类型不匹配

黄正浩
2023-03-14
enum State
{
   UP,
   DOWN,
   RETRY
};
private static boolean isValidBindValue(Class expectedType, Object value, TemporalType temporalType) {
        if ( expectedType.isInstance( value ) ) {
            return true;
        }
...
return false;
}

它打印出枚举值的等效字符串,这是因为这一行:

String.format("Parameter value [%s] did not match expected type [%s (%s)]",
               bind,
               parameterType.getName(),
               extractName( temporalType )
             )

通过调用表示枚举状态的对象上的ToString方法,将绑定对象隐式转换为字符串值。请重试

那么,如何使Hibernate相信state.retrystate的实例?

@Basic(optional = false)
@Column(name = "state")
@Enumerated(EnumType.String)
private State state;

我的RetryState枚举是由早期ClassLoader加载的。而query由URLClassLoader加载,EntityManager由另一个类加载器加载。

共有1个答案

常培
2023-03-14

我猜主要问题是您试图在数据库端使用枚举数据类型。不推荐这样做,因为它通常需要一个专有的枚举类型,而JPA实现(例如Hibernate)可能不太支持这个类型。有关详细信息,请参阅类似问题的答案。

此外,使用注释

@Enumerated(EnumType.String)

您是说您明确希望将该值保存为数据库中的字符串。如果真正的列类型是某个枚举,我希望这会失败。也许Hibernate代码更改试图通过强制您使用varchar或integer列来防止这些问题。

@Basic(optional = false)
@Column(name = "state", columnDefinition = "enum('UP','DOWN','RETRY')")
@Enumerated(EnumType.String)
private State state;

您可以尝试通过hibernate XML映射文件指定枚举类:

<property name="type" column="type" not-null="true">
    <type name="org.hibernate.type.EnumType">
        <param name="enumClass">package.name.State</param>
        <param name="type">12</param>
        <!-- 12 is java.sql.Types.VARCHAR -->
    </type> 
</property>

另见:

  • JPA枚举类型映射。最佳方法
  • Hibernate中的枚举,作为枚举持久化
  • MySQL枚举性能优势?
 类似资料:
  • 当我想跑的时候: 我得到: 执行操作“MappingAddAction”的服务异常,java.lang.IllegalArgumentException:参数值[5118]与预期的类型[com.vernuso.trust.server.domain.ClientImport.MappingInfo(N/A)]不匹配 有人能帮助我理解为什么它需要类型而不是类型吗? 我有两个表,如下图所示。Mappi

  • 我做错了什么? 正在更新: 我发现了问题所在。问题与ActionRepository中找到的函数有关。函数的签名首先要求两个日期进行比较,然后id和我给出了相反的值。我很清楚,在我上了它之后,我会有一个问题的日期,所以答案确实帮助了我。谢谢大家!

  • 我得到的错误. 我对此感到困惑,因为它来自下面显示的被注释掉的服务方法。当我把它注释掉时,错误就避免了。列是一个,即或。 实体: 我的存储库: 我的服务: 当我取消注释时

  • 这是我运行程序时收到的错误: 注:[19533]是我使用的一个测试值。 这是在CustomerServiceBeanImpl.java中出现错误的方法: 在快速检查ERD时,“Customer”表中的“id”列的数据类型为bigint。然而,我不确定这是否重要。(顺便提一下PostgreSQL数据库。) 如何修复此错误?

  • 问题内容: 我收到以下错误 java.lang.IllegalArgumentException: Parameter value [2] did not match expected type [com.cityBike.app.model.User (n/a)] at org.hibernate.jpa.spi.BaseQueryImpl.validateBinding(BaseQueryIm

  • 我在请求服务线路时收到此错误: 错误:组织。springframework。道。InvalidDataAccessApiUsageException:参数值[5]与预期类型[nz.webshop.models.Customer.Customers(不适用)]不匹配;嵌套的异常是java。lang.IllegalArgumentException:参数值[5]与预期类型[nz.webshop.mod