【问题标题】:SimpleJdbcInsert on MySQL DB returning BigInteger instead of Long after executeAndReturnKey methodMySQL DB 上的 SimpleJdbcInsert 在 executeAndReturnKey 方法后返回 BigInteger 而不是 Long
【发布时间】:2020-05-14 20:23:15
【问题描述】:

我正在使用以下主键声明对 MySQL 表运行一个简单的插入查询:

id BIGINT AUTO_INCREMENT NOT NULL PRIMARY KEY

由于某种原因,他们返回的键是 BigInteger。我需要进行哪些更改才能将 Long 值作为键返回?

编辑

我基本上是在制作一个 mini-ORM,而 Long 类型在编译时是未知的,因为它是一个类参数 (AbstractDao<T, I>)。本质上,我需要能够将 Number 转换为 Long 而无需使用其中包含 long 的任何内容(Long.valueOf()、.longValue() 等)。

我确实有一个包含 Long.class 的 Class 实例:

protected Class<?> idClass = ((Class<?>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[1]);

该实例能否以某种方式用于执行转换?您不能只将 BigInteger 转换为 Long,也不能将 BigInteger 的 String 表示形式转换为 Long。如果有办法从我的类对象访问 valueOf() 这可能有效?

【问题讨论】:

  • 我将密钥更改为 INT,但该方法仍然返回 BigInteger。由于大量的反射和泛型使用,我不能只做 Long.valueOf()。那个方法的返回类型是 Number,为什么要强制我使用 BigInteger?
  • 问题是,Long 类型是一个类参数 (T),在运行时不知道,所以我不能使用 longValue,因为有人可以根据需要用 Integer 参数化这个类。基本上我只需要一个 Class> 的实例将 Number 转换为 Long ,在这种情况下,它包含一个 Long.class 值。
  • 如果这是您的要求,那么请编辑问题并说出来,这样阅读问题的人就会知道您需要什么。显示您所指的方法,以澄清您在说什么。

标签: java mysql key spring-jdbc


【解决方案1】:

executeAndReturnKey(...) 返回一个Number,所以如果你想要一个long 的结果,请调用longValue()

如果您的方法不知道调用者所需的确切数字类型,请让调用者执行longValue()。或者,为您想要支持的各种返回类型编写多个方法,例如

public Number insertAndGetKey(...) {
    return ...executeAndReturnKey(...);
}
public int insertAndGetIntKey(...) {
    return insertAndGetKey(...).intValue();
}
public long insertAndGetLongKey(...) {
    return insertAndGetKey(...).longValue();
}

【讨论】:

  • 该方法是 Spring JDBC 的 SimpleJdbcInsert 类的一部分,我无法更改
  • @Martin 嗯?我说的是你的 AbstractDao 类中使用SimpleJdbcInsert 的方法。 --- 但也许如果您编辑了您的问题并澄清它,例如通过显示您实际拨打SimpleJdbcInsert 的位置,我们都在谈论同一件事。
【解决方案2】:

这虽然非常丑陋,但就像一个魅力:

var method = idClass.getMethod("valueOf", String.class);
var result = method.invoke(null, key.toString());

这会返回一些我可以毫无问题地类型转换为 (I) 的内容。如果您有更好的解决方案,请告诉我。最初的问题是关于 BigInteger 返回类型,这可能是可以避免的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 2018-01-25
    • 2018-12-10
    相关资源
    最近更新 更多