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

Я пытаюсь извлечь запись из базы данных, используя 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 INFO InventoryDAO: 1052 - sql: SELECT * FROM TBL_DISCOUNT, где Id = 30 2018-05-08 01:28:15 ИНФОРМАЦИЯ InventoryDAO: 1056 - скидка: discountId: 0 , HigherLimit: 0 , lowerLimit: 0 , discountPercentage: 0.0 : ID [30]: Создано СИСТЕМОЙ 2018-05-07 19: 06: 42.0, Обновлено по Рахулу 2018-05-07 19: 06: 42.0: V [2]

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

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

1 Ответ

0 голосов
/ 07 мая 2018

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

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

Значения столбцов отображаются на основе сопоставления имени столбца, полученного из метаданных набора результатов, с общедоступными установщиками для соответствующих свойств. Имена сопоставляются либо напрямую, либо путем преобразования имени, разделяющего части с подчеркиванием, в одно и то же имя, используя регистр «верблюд».

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

new BeanPropertyRowMapper(DiscountDetail.class)

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

discountId
higherLimit
lowerLimit
discountPercentage

Или как:

discount_id
higher_limit
lower_limit
discount_percentage

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

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