[英]BeanPropertyRowMapper not converting mysql tinyint 1 to boolean true
public class Foo {
private long id;
private String name;
private boolean isBar;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isBar() {
return isBar;
}
public void setBar(boolean isBar) {
this.isBar = isBar;
}
}
@Component
public class FooDAO {
private JdbcTemplate jdbcTemplate;
private FooDAO(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public List<Foo> findAll() {
return jdbcTemplate.query( "SELECT * FROM foo", new BeanPropertyRowMapper<>(Foo.class);
}
}
當我設置自定義FooRowMapper
並手動調用setBar(rs.getBoolean("is_bar"))
時,當 db 值為 1 時, Foo.isBar
正確設置為 true,但在使用BeanPropertyRowMapper
而不是自定義行映射器時則不會。
據此, BeanPropertyRowMapper
應該正確地將 1 轉換為 true,那么為什么不是我的情況呢?
ps 我已經弄清楚了原因,但我想我會發布它以防萬一它對任何人都有幫助。 我相信其他人很快就會弄清楚並發布答案。
我知道這一點:
列值的映射基於從結果集元數據中獲得的列名與相應屬性的公共設置器的匹配。 這些名稱可以直接匹配,也可以通過使用“camel”大小寫將用下划線分隔部分的名稱轉換為相同的名稱來匹配。
但是因為我的Foo.isBar
屬性具有與我的數據庫字段名稱( is_bar
)對應的正確駝峰式大小寫,所以被拋棄了,但是,我的公共設置器名稱與setBar
不正確; 設置器應該是setIsBar
。
在谷歌搜索之后,我也被其他想要使用BeanPropertyRowMapper
將 Y/N 的數據庫值轉換為 boolean 值的人拋棄了。
而且我還假設BeanPropertyRowMapper
實際上將值設置為false
,即使它不是,並且false
值只是保留為默認的 boolean 原始值。
如果出於某種原因實際上需要setBar
而不是setIsBar
,則另一種解決方案是在 sql select 語句中使用字段別名,就像它在文檔中所說的那樣:
為了便於在名稱不匹配的列和字段之間進行映射,請嘗試在 SQL 語句中使用列別名,例如“select fname as first_name from customer”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.