我不知道为什么但是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值。
答案 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的解决方案。