我知道 BeanPropertyRowmapper
在我触发 select
查询时使用 setter
方法但是它是否使用 getter
方法 ?
我面临以下问题:
在 database
中,defaultPriority 在 string
中,但我想在我的 SMSAction
pojo 类中设置 int
值.
class SMSAction implements Serializable {
private int defaultPriority;
public int getDefaultPriority() {
System.out.println("Inside getDefaultPriority()");
return defaultPriority;
}
public void setDefaultPriority(String defaultPriority) {
System.out.println("Inside setDefaultPriority(String defaultPriority)"+defaultPriority);
if(defaultPriority.equalsIgnoreCase("L")){
System.out.println("Condition");
this.defaultPriority = 1;
}
}
}
这是我遇到的错误:
Exception in thread "main" org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [select SMSACTIONID,SMSACTIONCODE,ACTIONDESC,CASID,DEFAULTPRIORITY from tblsmsaction]; SQL state [99999]; error code [17059]; Fail to convert to internal representation; nested exception is java.sql.SQLException: Fail to convert to internal representation
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:660)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:695)
当数据库和我的 pojo 中的数据类型不同时,如何解决上述问题?
当我将 return type of getDefaultPriority()
更改为 String
时,它的工作正常但我无法理解这就是为什么 BeanPropertyRowMapper
使用 getDefaultPrioriy()
以及我的 log
打印在 getDefaultPriority()
中的原因显示。
注意:我不想制作我的自定义行映射器或 hibernate 或 JPA。 请帮助我。
最佳答案
在我看来,您做错了(不是很)错。您有一些规则来设置
模板中的内容(阅读class
)。 Setters/Getters 应该非常整洁;事实上,你需要存储一个 int
但你正在应用一些规则来弄清楚 int
值与你设置/获取的方式无关bean 中的特定值。
每当您从数据库中获取 String
值时,应用规则并调用 setter:
// [db layer] here you already got the real value(s) through a database call
SMSAction action = new SMSAction();
// priority is some arbitrary name I used to simulate the variable that holds the String coming from the database
if (priority.equalsIgnoreCase("L")) {
action.setDefaultPriority(1);
}
// ...
现在,有些人更喜欢另一层的那种业务规则,但那是另一回事了;正如您所看到的,在 DTO/包装器对象或类似对象中将值从一层传输到另一层很容易。
祝你好运!
关于java - BeanPropertyRowMapper 在 spring 内部是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28060240/