Проблема с JdbcTemplate BeanPropertyRowMapper - установка полей int и double как 0 вместо фактического значения

Я пытаюсь получить запись из базы данных с помощью Spring Jdbctemplate. В JdbcTemplate я пытаюсь автоматизировать привязку данных, используя класс BeanPropertyRowMapper ... Тип имени столбца моей таблицы базы данных и тип имени поля объекта модели такие же ... Я реализовал этот API, но не получаю ожидаемых результатов. Для полей типа int и double я получаю значение 0 и 0,0, хотя это разные значения в базе данных ...

Пожалуйста, помогите решить эту проблему ... Мой код, как показано ниже,

@Override
public DiscountDetail getDiscountDetailById(int ID) throws ServiceException 
{
    String sql = "SELECT * FROM TBL_DISCOUNT where Id = "+ID;
    logger.info("sql :"+sql);
    List<DiscountDetail> discounts  = jdbcTemplate.query(sql, new BeanPropertyRowMapper(DiscountDetail.class));

    if (discounts.size() == 1) {
        logger.info("discount :"+discounts.get(0).toString());
        return discounts.get(0);
    }   
    return null;
} 

DescountDetail.java

открытый класс DiscountDetail extends GenericEntity {

private int discountId,higherLimit,lowerLimit;
private double discountPercentage;

public int getDiscountId() {
    return discountId;
}

public void setDiscountId(int discountId) {
    this.discountId = discountId;
}

public int getHigherLimit() {
    return higherLimit;
}

public void setHigherLimit(int higherLimit) {
    this.higherLimit = higherLimit;
}

public int getLowerLimit() {
    return lowerLimit;
}

public void setLowerLimit(int lowerLimit) {
    this.lowerLimit = lowerLimit;
}

public double getDiscountPercentage() {
    return discountPercentage;
}

public void setDiscountPercentage(double discountPercentage) {
    this.discountPercentage = discountPercentage;
}


public String toString() 
{
    StringBuffer sb = new StringBuffer("");
    sb.append("discountId: " + discountId);
    sb.append(", higherLimit:" + higherLimit);
    sb.append(", lowerLimit:" + lowerLimit);
    sb.append(", discountPercentage:" + discountPercentage);
    sb.append(super.toString());
    return sb.toString();
}

}

--
-- Table structure for table `TBL_DISCOUNT_DETAIL`
--

CREATE TABLE `TBL_DISCOUNT_DETAIL` (
  `Id` int(11) NOT NULL,
  `DiscountId` int(11) NOT NULL,
  `HigherLimit` int(11) NOT NULL,
  `LowerLimit` int(11) NOT NULL,
  `DiscountPercentage` double NOT NULL,
  `CreatedOn` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `CreatedBy` varchar(100) NOT NULL,
  `UpdatedOn` timestamp NULL DEFAULT NULL,
  `UpdatedBy` varchar(100) DEFAULT NULL,
  `VersionId` int(11) NOT NULL DEFAULT '1'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Фактический выход:

2018-05-08 01:28:15 ИНФОРМАЦИЯ InventoryDAO: 1052 - sql: SELECT * FROM TBL_DISCOUNT, где Id = 30 2018-05-08 01:28:15 INFO InventoryDAO: 1056 - скидка: DiscountId: 0, upperLimit: 0, lowerLimit: 0, DiscountPercentage: 0,0: ID [30]: Создано СИСТЕМОЙ 2018-05-07 19: 06: 42.0, Обновлено Рахулом 2018-05 -07 19: 06: 42.0: В [2]

Ожидаемый результат:

2018-05-08 01:28:15 ИНФОРМАЦИЯ InventoryDAO: 1052 - sql: SELECT * FROM TBL_DISCOUNT, где Id = 30 2018-05-08 01:28:15 INFO InventoryDAO: 1056 - скидка: DiscountId: 1, вышеПредел: 5, lowerLimit: 20, скидкаПроцент: 5.0: ID [30]: Создано СИСТЕМОЙ 2018-05-07 19: 06: 42.0, Обновлено Рахул 2018-05 -07 19: 06: 42.0: В [2]

Вероятно, вам следует использовать подготовленный оператор для вашего SQL для начала. Кроме того, необходимы имена столбцов, чтобы убедиться, что Bean Mapper работает должным образом.

Compass 07.05.2018 22:33

@Compass .... С моей стороны была глупая ошибка ... Я ошибся в названии таблицы ... Спасибо ...

rahul shalgar 16.05.2018 06:15
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
3 040
1

Ответы 1

Имейте в виду, что если вы используете BeanPropertyRowMapper, вы также соглашаетесь позволить ему фактически отображать имена полей вашей базы данных на ваш объект на основе его внутренней логики.

Особенно важно этот бит из JavaDoc:

Column values are mapped based on matching the column name as obtained from result set metadata to public setters for the corresponding properties. The names are matched either directly or by transforming a name separating the parts with underscores to the same name using "camel" case.

Итак, в этом случае вы используете

new BeanPropertyRowMapper(DiscountDetail.class)

и на основе класса DiscountDetail вы также должны были определить имена столбцов в целевой таблице базы данных как:

discountId
higherLimit
lowerLimit
discountPercentage

Или как:

discount_id
higher_limit
lower_limit
discount_percentage

Скорее всего, имена общедоступных методов установки в DiscountDetail не совпадают с именами полей базовой таблицы.

Да, Микгаэль ... Я сопоставил имена полей базы данных с моим объектом ... Тем не менее, я столкнулся с этой проблемой ...

rahul shalgar 08.05.2018 05:39

@rahulshalgar Вы пробовали менять имена столбцов? discount_id вместо DiscountId, как предложено в ответе

Markus Pscheidt 08.05.2018 21:44

@Micgaek Peacock .... С моей стороны была глупая ошибка ... Я ошибся в названии таблицы ... Проблема исправлена ​​... Большое спасибо за сотрудничество ...

rahul shalgar 16.05.2018 06:12

Да - TBL_DISCOUNT_DETAIL против TBL_DISCOUNT. Это те мелкие детали, которые тебя поймут

Michael Peacock 16.05.2018 17:05

Другие вопросы по теме