假设我有一个Oracle数据库和这样的界面:
public interface DaoMapper {
@Select({
"SELECT col1, col2, col3",
"FROM my_table" })
List<Map<String, Object>> getUntyped();
}
如果我调用getUntyped()
并且所有列都有值,则地图包含三个条目。但是,如果col2
为NULL
,则地图只有两个条目。在许多情况下,这不是问题,但在我们代码的通用部分中,我实际上想在该地图上调用.values()
并且想要一个由三个条目组成的列表。任何条目都可以是null
(或者是一个空字符串,因为在Oracle中是相同的。)
实际上,我真正高兴的是这样的,每个外部列表都包含三个条目的列表:
@Select({
"SELECT col1, col2, col3",
"FROM my_table" })
List<List<Object>> getUntypedList();
但是,iBatis告诉我这是一个不受支持的操作。
因此,我在这里问我如何告诉iBatis包含NULL
或空字符串的列。
答案 0 :(得分:0)
配置属性callSettersOnNulls
默认为false(更多信息here);你需要将它设置为true,但它会影响所有语句,而不仅仅是你需要的语句。另请注意,不同的mybatis版本可能会在该区域显示一些错误,因为您可以检查here;所以你必须检查你正在使用的mybatis版本
答案 1 :(得分:0)
感谢Giovanni's answer我注意到example for type handlers并从那里开始:
public class EmptyStringTypeHandler extends StringTypeHandler {
@Override
public String getResult(ResultSet rs, String columnName) throws SQLException {
return unnulledString(super.getResult(rs, columnName));
}
@Override
public String getResult(ResultSet rs, int columnIndex) throws SQLException {
return unnulledString(super.getResult(rs, columnIndex));
}
@Override
public String getResult(CallableStatement cs, int columnIndex) throws SQLException {
return unnulledString(super.getResult(cs, columnIndex));
}
private String unnulledString(String value) {
return StringUtils.defaultString(value, "");
}
}
界面现在是:
public interface DaoMapper {
@Select({
"SELECT col1, col2, col3",
"FROM my_table" })
@Results(value = {
@Result(column = "col1", property = "col1", typeHandler = EmptyStringTypeHandler.class),
@Result(column = "col2", property = "col2", typeHandler = EmptyStringTypeHandler.class),
@Result(column = "col3", property = "col3", typeHandler = EmptyStringTypeHandler.class)
})
List<LinkedHashMap<String, ?>> getUntyped();
}
我应该补充说,最大的好处是我可以为每个语句指定每列。对于更通用的用法,最好指定此per语句。也许在未来的某个版本?