【问题标题】:JDBCTemplate Boolean not mapping properly with BeanPropertyRowMapperJDBCTemplate Boolean 没有与 BeanPropertyRowMapper 正确映射
【发布时间】:2018-04-06 23:39:19
【问题描述】:

我有一个带有用户表的标准 MySql 数据库。在这个表中有一个名为“isApproved”的 TINYINT(4)

对于这个用户,它设置为“1”(我相信这是真的)我的 bean 属性如下所示:

private boolean isApproved;

以及适当的 getter/setter:

public boolean isApproved() {
    return isApproved;
}
public void setApproved(boolean isApproved) {
    this.isApproved = isApproved;
}

我有一个 jdbcTemplate 正在拉取正确的用户,它看起来像这样:

public UserBean findUserByUserName(String userName) {
    String sql = "SELECT * FROM User WHERE name = ?";
    return (UserBean)getJdbcTemplate().queryForObject(sql, new BeanPropertyRowMapper<UserBean>(UserBean.class), userName);
}

所以我认为我可能犯了一个简单的错误,我将其添加到日志记录中:

logger.debug("User from DB isApproved:"+userFromDb.isApproved());

即使数据库中有一个“1”,这也会返回“假”。

如何使这个映射正确,isApproved 是“1”,它应该等同于布尔值。

【问题讨论】:

  • 不确定,但我相信这个问题发生在我身上。将 isApproved 更改为已批准,并将方法更改为 getApproved()。我记得 JDCB 引擎会在你的情况下寻找 set+variable name 的问题。 setIsApproved() 所以它不会尊重布尔值的java命名约定。因此,只需将变量名称更改为普通名称,并使用普通 set 和 get。
  • @MohdAlomar 名称isXxx 适用于 boolean getter 方法。它是 bean 命名标准的一部分。这不是 JDBC 引擎做的。这是 Spring BeanPropertyRowMapper 类。
  • @Andreas 不确定,但问题发生在我使用球衣、休眠和实体时。
  • @MohdAlomar 这个问题是关于使用JdbcTemplateBeanPropertyRowMapper 的Spring Framework 代码。只是 JDBC 和 Spring。没有泽西岛。没有休眠。没有 JPA。那么你所说的与这个问题有什么关系,isApproved 是一个非常好的名称(一旦 OP 使用列别名来解决命名问题)?告诉 OP 不要使用 isApproved 具有误导性。

标签: java spring jdbctemplate


【解决方案1】:

bean命名的意思是你取列名,然后调用setter方法setColumnName,调用getter方法getColumnName,除了布尔值,它被命名为isColumnName

您的列名为isApproved,因此标准bean 名称将是setIsApprovedisIsApproved。看到问题了吗?

正如BeanPropertyRowMapper 的 javadoc 所说:

为了便于在名称不匹配的列和字段之间进行映射,请尝试在 SQL 语句中使用 列别名,例如:

select fname as first_name from customer

这意味着你不能使用SELECT *,但这没关系,因为你应该永远在代码中使用SELECT *。见Why is SELECT * considered harmful?

* 便于即席查询,或使用元数据分析结果列的动态数据查询。由于需要映射到特定的类,所以需要选择需要映射的列。

【讨论】:

  • 额外的就是这样做的。但是,当拉 ONE bean 并使用映射器时,我不同意 select *。在进行连接等时,我从不这样做,但这是另一个讨论。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2020-01-08
  • 2018-05-09
  • 1970-01-01
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多