Я пытаюсь получить запись из базы данных с помощью 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]
@Compass .... С моей стороны была глупая ошибка ... Я ошибся в названии таблицы ... Спасибо ...




Имейте в виду, что если вы используете 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 не совпадают с именами полей базовой таблицы.
Да, Микгаэль ... Я сопоставил имена полей базы данных с моим объектом ... Тем не менее, я столкнулся с этой проблемой ...
@rahulshalgar Вы пробовали менять имена столбцов? discount_id вместо DiscountId, как предложено в ответе
@Micgaek Peacock .... С моей стороны была глупая ошибка ... Я ошибся в названии таблицы ... Проблема исправлена ... Большое спасибо за сотрудничество ...
Да - TBL_DISCOUNT_DETAIL против TBL_DISCOUNT. Это те мелкие детали, которые тебя поймут
Вероятно, вам следует использовать подготовленный оператор для вашего SQL для начала. Кроме того, необходимы имена столбцов, чтобы убедиться, что Bean Mapper работает должным образом.