Hibernate强制转换BigDecimal而不是Integer

时间:2010-02-25 13:58:32

标签: java hibernate orm db2

我不知道为什么但是hibernate试图将BigDecimal强制转换为我的一个列。此列在我的DB2 DB中定义为Decimal(3,0)。所以不能有BigDecimal。

的hbm.xml

  <composite-id name="Id" class="db2.P5Id">
   ....
    <key-property name="land" type="int">
        <column name="PFIELD1" precision="3"/>
    </key-property>
    ....
 </composite-id>

当我尝试提交像

这样的查询时
sf.createQuery("from P5 where type = 1 and land in (:cs)")
     .setParameterList("cs", cses, Hibernate.INTEGER).list()

我得到了ClassCastException。提供的Collection只有Integer值。

2 个答案:

答案 0 :(得分:3)

这看起来像this thread中讨论的“问题”,建议的 fix 解决方法是将DB2Dialect子类化:

import org.hibernate.dialect.DB2Dialect;
import java.sql.Types;

public class FixedDB2Dialect extends DB2Dialect {

    public FixedDB2Dialect() {
    super();
    registerColumnType(Types.INTEGER, "decimal($p)");
    registerColumnType(Types.NUMERIC, "decimal($p,$s)");
    registerColumnType(Types.DECIMAL, "decimal($p,$s)");
    }
} 

官方补丁可能存在Jira问题,但我找不到它。

答案 1 :(得分:1)

我很好奇为什么你的数据库被建模为使用0比例而不是整数类型的十进制类型?你看到的行为(以及Pascal提到的“问题”)是因为hibernate自然地认为DECIMAL是一个浮点类型,并且当你将它配置为int时会感到困惑。

是否可以将db2中的数据类型更改为SMALLINT?这可能会占用较少的空间(2个字节而不是3个),并且在逻辑上更加一致。

如果没有,请使用Pascal的解决方案。