【问题标题】:Issue with JdbcTemplate BeanPropertyRowMapper - setting int & double field as 0 instead of actual valueJdbcTemplate BeanPropertyRowMapper 的问题 - 字符串 int 和 double 字段为 0 而不是实际值
【发布时间】:2023-04-04 14:08:01
【问题描述】:

我正在尝试使用 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 扩展了 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 where Id=30 2018-05-08 01:28:15 INFO InventoryDAO:1056 - 折扣:discountId: 0, higherLimit:0, lowerLimit:0, discountPercentage:0.0:ID[30]:由 SYSTEM 于 2018-05-07 19:06:42.0 创建,由 Rahul 于 2018-05-07 19:06:42.0:V[2] 更新 p>

预期输出:

2018-05-08 01:28:15 INFO InventoryDAO:1052 - sql :SELECT * FROM TBL_DISCOUNT where Id=30 2018-05-08 01:28:15 INFO InventoryDAO:1056 - 折扣:discountId: 1, higherLimit:5, lowerLimit:20, discountPercentage:5.0:ID[30]:由 SYSTEM 于 2018-05-07 19:06:42.0 创建,由 Rahul 于 2018-05-07 19:06:42.0:V[2] 更新 p>

【问题讨论】:

  • 您可能应该为您的 SQL 使用准备好的语句来开始。此外,需要列名来验证 Bean Mapper 是否按预期工作。
  • @Compass....我这边犯了一个愚蠢的错误...我输入了错误的表名...谢谢...

标签: java spring jdbctemplate spring-orm


【解决方案1】:

请记住,如果您使用的是 BeanPropertyRowMapper,您也同意允许它根据其内部逻辑实际将您的数据库字段名称映射到您的对象。

特别重要的是this bit from the JavaDoc

根据从结果集元数据中获得的列名与相应属性的公共设置器的匹配,映射列值。这些名称可以直接匹配,也可以通过使用“camel”大小写将分隔带下划线的部分的名称转换为相同的名称来匹配。

所以,在这种情况下,您使用的是

new BeanPropertyRowMapper(DiscountDetail.class)

基于 DiscountDetail 类,您还应该将目标数据库表中的列名定义为:

discountId
higherLimit
lowerLimit
discountPercentage

或如:

discount_id
higher_limit
lower_limit
discount_percentage

很可能,DiscountDetail 中的公共 setter 方法的名称与基础表的字段名称不匹配。

【讨论】:

  • 是的 Micgael .....我已经将我的数据库字段名称映射到我的对象...。我仍然面临这个问题...
  • @rahulshalgar 你试过改变列名吗? discount_id 而不是 DiscountId,就像答案中建议的那样
  • @Micgaek Peacock ....我这边犯了一个愚蠢的错误...我输入了错误的表名...问题已解决...非常感谢您的合作...
  • 是的 - TBL_DISCOUNT_DETAIL 与 TBL_DISCOUNT。正是这些小细节让你着迷
【解决方案2】:

javabean 类DiscountDetail 的字段至少有两个要求不能为空:

  • 名称匹配:1.java类字段名与db列名相同2.或列名下划线分隔,字段名对应驼峰式
  • 该字段具有公共设置器

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    相关资源
    最近更新 更多