相关疑难解决方法(0)

Hibernate - Custom Dialect的BigDecimal列映射

我正在使用Hibernate作为我们的对象关系映射,使用一个隐藏数据库的自定义方言.

我从这个数据库中检索的实体有一列:

    @Column(name = "GROSS_WEIGHT", precision = 9, scale = 3)
    private BigDecimal grossWeight;
Run Code Online (Sandbox Code Playgroud)

数据库将此列定义为数字,精度为9,标度为3.

我可以看到Hibernate生成的SQL来检索数据,当我使用数据库查询工具执行相同的Query时,它会返回GROSS_WEIGHT列的"9.68".

但是,在由Hibernate检索的实体中,'grossWeight'字段包含值'10',其中scale0和precision2 为0 !

在我正在使用的自定义方言类中,我尝试重写以下列类型:

        registerColumnType( Types.DECIMAL, "numeric($p,$s)" );
        registerColumnType( Types.DOUBLE, "numeric($p,$s)" );
        registerColumnType( Types.NUMERIC, "numeric($p,$s)" );
Run Code Online (Sandbox Code Playgroud)

但它仍然只返回(舍入的)整数.

这在我们使用Postgres方言从Postgres检索对象的应用程序的其他地方有效.

知道我应该在方言中做什么,所以我可以让Hibernate正确设置检索到的BigDecimal的精度/比例?

java hibernate jpa bigdecimal hibernate-mapping

9
推荐指数
1
解决办法
4638
查看次数

将数字(22,21)映射到BigDecimal时,Hibernate在结果中的精度损失

我在Oracle 11g中将此列映射为NUMBER(21,20),它在Hibernate中映射为:

@Column(name = "PESO", precision = 21, scale = 20, nullable = false)
public BigDecimal getWeight() {
    return weight;
}
Run Code Online (Sandbox Code Playgroud)

对于列的值为0.493的特定记录,我得到一个BigDecimal,其值为0.49299999999.似乎某些地方由于(可能)Double或Float转换而导致精度损失,但我无法通过这样的简单单元测试来跟踪它:

Double d = new Double("0.493");
System.out.println((d));
Run Code Online (Sandbox Code Playgroud)

该代码的任何变体,使用Float,BigDecimal和各种构造函数都会得到相同的结果:"0.493"...有关如何映射列以避免此类问题的任何提示?我正在使用Hibernate 3.5.6,带有JPA注释和Hibernate API(即Session而不是EntityManager)

java oracle double hibernate bigdecimal

5
推荐指数
1
解决办法
7462
查看次数

使用 Hibernate 将 BigDecimal 存储到 H2 时丢失精度

我们使用 H2 数据库进行测试,但是当我使用 Hibernate 将 BigDecimal 值存储到其中然后将其加载回时,该值会被截断为两位小数:

字段定义如下所示

@Column(name = "Rate", nullable = true)
private BigDecimal rate;
Run Code Online (Sandbox Code Playgroud)

所以 1.456 被截断为 1.46。

我不知道预先的精度(每个实体都不同),所以我无法在注释上定义它们。

有没有办法解决这个问题?

java database hibernate jpa h2

5
推荐指数
1
解决办法
4774
查看次数

Hibernate - BigDecimal Mapping Precision

问题: 从oracle数据库中获取类似50.20的值时,似乎我的大小数的映射类正在下降0.如果它的50.23,它将正确获取值,但最后没有0.我想象我想念的东西很简单.建议?提前致谢.

细节

数据库:Oracle 11G字段定义:数字(8,2)

映射getter/setter

    @Column ( name="PRICE", precision = 8, scale = 2 )
private BigDecimal price;

public BigDecimal getPrice()
{
    return price;
}
public void setPrice( BigDecimal price )
{
    this.price = price;
}
Run Code Online (Sandbox Code Playgroud)

java hibernate

4
推荐指数
1
解决办法
2万
查看次数

标签 统计

hibernate ×4

java ×4

bigdecimal ×2

jpa ×2

database ×1

double ×1

h2 ×1

hibernate-mapping ×1

oracle ×1