Hibernate бросает BigDecimal вместо Integer - PullRequest
0 голосов
/ 25 февраля 2010

Не знаю почему, но hibernate пытается привести BigDecimal к одному из моих столбцов. Этот столбец определен как десятичный (3,0) в моей БД DB2. Так что не может быть 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. Предоставленная коллекция имеет только целочисленные значения.

Ответы [ 2 ]

3 голосов
/ 25 февраля 2010

Это похоже на "проблему", обсуждаемую в этой теме , и предлагаемый обходной путь 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 голос
/ 25 февраля 2010

Мне интересно, почему ваша база данных была смоделирована для использования десятичного типа с 0 шкалой, а не целочисленного типа? Поведение, которое вы видите (и упоминает «проблема» Паскаля), заключается в том, что hibernate естественно предполагает, что DECIMAL является типом с плавающей запятой, и сбивается с толку, когда вы настраиваете его как int.

Можно ли изменить тип данных в db2 на SMALLINT? Это, вероятно, заняло бы меньше места в БД (2 байта, а не 3) и было бы более логически согласованным.

Если нет, воспользуйтесь решением Паскаля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...