SimpleJdbcInsert在MySQL DB上,在executeAndReturnKey方法后返回BigInteger而不是Long。

问题描述 投票:0回答:1

我正在MySQL表上运行一个简单的插入查询,主键声明如下。

id BIGINT AUTO_INCREMENT NOT NULL PRIMARY KEY

由于某些原因,返回的键是一个BigInteger。 我需要做什么改变,才能将Long值作为键返回?

编辑

我基本上是在做一个迷你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的字符串表示投向一个Long。 如果有一种方法可以从我的类对象中访问valueOf(),这可能会有效。

java mysql key spring-jdbc
1个回答
0
投票

executeAndReturnKey(...) 返回一个 Number,所以叫 longValue() 如果你想把结果作为 long.

如果你的方法不知道调用者所需要的确切的数字类型,那么就让调用者来做吧 longValue(). 或者,为你想支持的各种返回类型编写多个方法,例如

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

0
投票

虽然这个方法非常丑陋,但它的工作原理却很好。

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

这个方法返回的东西我可以毫无问题地类型化为(I)。 如果你有更好的解决方案,请告诉我。 最初的问题是关于BigInteger返回类型,这可能是可以避免的。

© www.soinside.com 2019 - 2024. All rights reserved.