当前位置: 首页 > 面试题库 >

如何在iBatis中返回NULL值?

濮阳烨然
2023-03-14
问题内容

假设我有一个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或为空字符串的列。


问题答案:

多亏了乔凡尼(Giovanni)的回答,我注意到了类型处理程序的示例,然后从那里开始:

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();

}

我应该补充一点,最大的好处是我可以在每条语句的每一列中指定它。为了更通用,最好按每个语句指定此名称。也许在将来的版本中?



 类似资料:
  • ====下面是完整的存储库,如果您希望查看更新后的存储库:https://github.com/kidfrom/g2java/tree/main/etc/mssqlserver 控制器/nameController.java mapper/namemapper.java model/namemodel.java

  • 我有以下模式: 模式反映了一个事实,即我必须返回一个对象。然而,我不能总是这样做,有时我需要返回null。例如,如果我向数据库发出请求,它将返回return object或null(如果找不到用户)。 在我的GraphQL模式中,我为特定字段设置了类型。如果我试图返回一个不同于我设置的类型,我会得到一个错误。如何允许字段返回对象或null?

  • 问题内容: 我正在尝试在Java程序中阅读标准输入。我期望一系列数字后跟换行符,例如: 当通过eclipse内置控制台提供输入时,一切都会顺利进行。但是,使用Windows命令行时,程序将输出: 我的代码是: 有什么线索吗? 问题答案: 得到a 表示相关对象已到达EOF(文件末尾),或者换句话说,它们无法再获得任何标准输入。现在,您的代码明显的问题是: 的每个方法调用都会创建一个 新的 。 每个这

  • 在我开始之前,我读过类似的文章,但它们对我不起作用。 正如我在标题中解释的那样,当我单击肯定按钮(在这种情况下为“确定”)时,我会得到一个NPE。如果有人能指出我做得不正确,那就太好了!下面是我的设置的抽象版本

  • 我有两个活动和两个布局。当我在第一个活动中显示列表时,一切都正常,并在单击时给出列表中项目的编号,但当我尝试在第二个活动中重复相同的内容时,它会告诉我RecycleServiceClickListener侦听器为空。 适配器: 第一项活动: 第二项活动: 错误: 我不明白为什么在第一种情况下,它正常处理单击,而在第二种情况下,它说RecyclerViewClickListener为null