当前位置: 首页 > 知识库问答 >
问题:

JdbcTemplate BeanPropertyRowMapper的问题-将int和double字段设置为0而不是实际值

赵景曜
2023-03-14

我正试图使用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

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:选择*FROM TBL_DISCOUNT,其中ID=30 2018-05-08 01:28:15 INFO inventorydao:1056-discount:discountid:1,高限:5,低限:20,折扣百分比:5.0:ID[30]:系统在2018-05-07 19:06:42.0创建,拉胡尔在2018-05-07 19:06:42.0:V[2]更新

共有1个答案

李星辰
2023-03-14

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

特别重要的是Javadoc中的这一点:

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

new BeanPropertyRowMapper(DiscountDetail.class)
discountId
higherLimit
lowerLimit
discountPercentage
discount_id
higher_limit
lower_limit
discount_percentage
 类似资料:
  • 我试图用一个值为0或1的布尔字段来持久化一个条令实体。 当属性设置为true时,它会在数据库中将其另存为“1”。但当其值为“false”或“0”时,它会在数据库中将其另存为NULL。 我如何解决这个问题,只保存为1或0? 我使用的属性的注释如下所示: 当我将nullable设置为false时,我不能坚持它,因为它仍然想要设置为null。 谢谢 当我将其持久化时,字段值为0 尝试1@ORM\列(名称

  • 问题内容: 在Swift中,是否可以将最大INT值设置为UITextField? 我的用例是我有5个文本字段,它们需要具有最大的int值。这些值的范围从500一直到10,000。5个不同的文本字段中的每个字段将具有不同的最大值。我不能使用选择器或下拉列表,因为增量将是1。UISlider太难了,无法“擦入”数字。 如果最大int值为5,000,则用户不能(在数字键盘的键盘类型上)输入大于5000的

  • 问题内容: 我有一个将Android数据保存在其中的函数,但必须将数据转换为。 只要是我想保存为 以下是我的代码,只要值是 将上述转化为。 这是我决定要执行的操作,但是仍然无法将字符串值转换为每当它的。 然后功能 我应该如何对其进行更改以使其起作用? 问题答案: 不用编写自己的函数,而是使用try-catch的内部构造。您的问题是,or 或值本身是a,并且您在null引用上调用方法。请尝试以下操作

  • 问题内容: 如何显示JPasswordField的文本,而不是将0设置为echo char? Java文档说: 设置值为0表示您希望看到键入的文本,这与标准JTextField的行为类似。 以下导致不兼容类型错误 鲸鱼 只需将0设置为echo char(每位显示0)。 在JTextField上使用JPasswordField的原因是我想更改回显字符并用另一种方法隐藏密码。 谢谢! 问题答案: 做这

  • 问题内容: 我必须编写一个例程,如果变量的类型为,则将变量的值加1,否则将变量的值分配为0,其中变量的初始值为或。 第一个实现是因为我认为没有数字会使算术表达式为假,但是由于计算为真,所以这是错误的。然后,我得知行为类似于0,并且以下表达式均被评估为true。 当然不是0。被评估为false。这使看似重言式的表达成为错误。 为什么实际上不是0,却像0? 问题答案: 您真正的问题似乎是: 为什么: