我遇到了有关使用 Hibernate 检索 10^18 位数字的问题。尽管我不完全确定这是否完全是 Oracle 数据库、Grails、Hibernate 或 Java 问题。考虑这个 Grails 域类:
class Payment {
BigInteger id
BigDecimal amount
static mapping = {
id generator: "assigned"
version false
}
}
我在检索时遇到了这个问题:
Payment savePayment() {
BigInteger id = 201910151421550246D
BigDecimal amount = 100.00G
Payment payment = new Payment()
payment.id = id
payment.amount amount
payment.save(flush: true)
Payment retrievedPayment = Payment.findById(id)
println "payment.id: " + payment.id
println "payment.amount: " + payment.amount
println "retrievedPayment.id: " + retrievedPayment.id
println "retrievedPayment.amount: " + retrievedPayment.amount
// payment.id: 201910151421550246
// payment.amount: 100.00
// retrievedPayment.id: 201910151421550240
// retrievedPayment.amount: 100.00
return retrievedPayment
}
我在保存之前指定了 201910151421550246
作为 id,并且还确认了它的值是否与数据库中的值相同。确实如此。此外,当我尝试使用该 id
检索所述记录时,我仍然可以检索相同的 Payment
记录。问题是为什么数值会相差六分呢?目前,我将其映射到 String
数据类型,并在需要执行数值运算时将其转换为 BigInteger,作为临时解决方案。
最佳答案
这不是Oracle数据库或Java BigInteger或hibernate的问题,因为它们支持超过201910151421550246个数字。
在网络应用程序的上下文中,大于 Number.MAX_SAFE_INTEGER 的值对于浏览器来说被认为不可靠。
就像我们打印console.log(201910151421550246);在 JavaScript 中,我们得到 201910151421550240 作为输出。
所以,如果你想使用大于Number.MAX_SAFE_INTEGER的数字,那么将其转换为String然后使用它。
关于java - 在 Hibernate 中检索使用 BigInteger 映射的属性时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58518840/