如何在iBatis中返回NULL值?

时间:2015-07-01 11:29:24

标签: java ibatis

假设我有一个Oracle数据库和这样的界面:

public interface DaoMapper {

  @Select({
      "SELECT col1, col2, col3",
        "FROM my_table" })
  List<Map<String, Object>> getUntyped();

}

如果我调用getUntyped()并且所有列都有值,则地图包含三个条目。但是,如果col2NULL,则地图只有两个条目。在许多情况下,这不是问题,但在我们代码的通用部分中,我实际上想在该地图上调用.values()并且想要一个由三个条目组成的列表。任何条目都可以是null(或者是一个空字符串,因为在Oracle中是相同的。)

实际上,我真正高兴的是这样的,每个外部列表都包含三个条目的列表:

  @Select({
      "SELECT col1, col2, col3",
        "FROM my_table" })
  List<List<Object>> getUntypedList();

但是,iBatis告诉我这是一个不受支持的操作。

因此,我在这里问我如何告诉iBatis包含NULL或空字符串的列。

2 个答案:

答案 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语句。也许在未来的某个版本?