Найден неправильный тип столбца Hibernate MS-SQL: десятичный, ожидаемый: с плавающей запятой

#java #hibernate

#java #гибернация

Вопрос:

Примечание: Ответ в конце вопроса

Я создал несколько столбцов в своей базе данных My SQL и, очевидно, раньше не создавал с плавающей запятой, потому что мне нужно было его искать. Для соответствия SQL я создал свои столбцы таким образом:

ИЗМЕНИТЬ датчик ТАБЛИЦЫ, ДОБАВИТЬ поле 1_calibration_offset DECIMAL(4, 3);

Умножьте 8 на каждый столбец.

Я определил их в своем Java-коде следующим образом:

@Column(name = «FIELD1_CALIBRATION_OFFSET») частное поле с плавающей запятой 1calibrationoffset;

что привело к ошибке:

Неправильный тип столбца в PsDb.dbo.Sensor для столбца FIELD1_CALIBRATION_OFFSET. Найдено: десятичный, ожидаемый: с плавающей точкой

Окончательный ответ

Следуя приведенному ниже ответу @jbrookover, я изменил на BigDecimal, я получил:

 Wrong column type in PsDb.dbo.Sensor for column FIELD1_CALIBRATION_OFFSET. Found: decimal, expected: numeric(19,2)
  

Итак, я просмотрел свои сопоставления в режиме гибернации и сделал:

 @Column(name = "FIELD1_CALIBRATION_SCALE", columnDefinition="decimal", precision=4, scale=3)
private BigDecimal field1CalibrationScale;
  

Ответ №1:

Я склонен позволять Hibernate создавать свои таблицы, поэтому я не уверен в этом на 100%, но нет никаких оснований предполагать, что Java Float сопоставляется с ДЕСЯТИЧНЫМ MySQL. На самом деле, согласно документации, DECIMAL — это точный тип, а FLOAT и REAL — приближения. Я считаю, что Java Float является приближением, поэтому это несоответствие кажется логичным.

Если вы хотите использовать ДЕСЯТИЧНЫЙ MySQL, попробуйте Java java.math.BigDecimal вместо java.lang.Float .

Комментарии:

1. Вы правы в том, что Java float является приближением. Я должен был подумать об использовании BigDecimal сам. Позвольте мне поработать над этим. Что бы я использовал в своей базе данных для сопоставления с float? Кроме того, это MS SQL Server, а не MySQL.

2. После перехода на BigDecimal я получил: Неправильный тип столбца в PsDb.dbo.Sensor для столбца FIELD1_CALIBRATION_OFFSET. Найдено: десятичный, ожидаемый: числовой (19,2) Поэтому я просмотрел свои сопоставления в режиме гибернации и сделал: @Column(name = «FIELD1_CALIBRATION_SCALE», ColumnDefinition =»десятичный», точность = 4, масштаб = 3) частное десятичное поле 1calibrationscale;

Ответ №2:

Я сам столкнулся с этой проблемой, используя Jboss 7 и MSSQL.

Я считаю, что ответ @Thom правильный и заслуживает большего внимания.

обратите внимание, что параметр name является необязательным, если ваше значение имеет то же имя, что и столбец базы данных.

 @Column(name="myColumnName" columnDefinition="decimal", precision=18, scale=3)
private BigDecimal myColumnName;
  

Комментарии:

1. На самом деле это комментарий к другому ответу. Я не думаю, что это должно быть опубликовано как вопрос.

2. @joelgoldstick Я не хотел публиковать это как вопрос, а скорее как ответ. Том упомянул это решение в комментарии к приведенному выше ответу. Я лично видел этот пост 2 раза, прежде чем понял, что ответ на его первоначальный вопрос был скрыт в комментарии к ответу выше.

3. моя ошибка. Я хочу ответить.

4. @andreico Спасибо за отзыв. Я включил свой ответ в вопрос, чтобы его было легче найти. Пожалуйста, проголосуйте, чтобы повысить видимость.

5. Это сработало для моего десятичного числа (22,4), выполнив точность = 22, масштаб = 4 для BigDecimal. Спасибо, чувак.