myBatis可调用语句 - java日期问题

时间:2014-02-20 23:50:25

标签: mybatis java.util.date callable-statement

我使用的是mybatis-3.1.1,以下代码没有问题。

DAO实施

    @Override
public ItunesPriorityReportDates getWeeklyPriorityDates(Date reportRunDate){

    ItunesPriorityReportDates itunesPriorityReportDates = new ItunesPriorityReportDates();
    Map<String,Object> weeklyPriorityDatesParamMap = new HashMap<>();

    weeklyPriorityDatesParamMap.put("reportRunDate", reportRunDate);

    log.debug("Report Run Date : " + reportRunDate);

    this.getItunesAnalysisMapper().getWeeklyPriorityDates(weeklyPriorityDatesParamMap);

    itunesPriorityReportDates.setAriaWeekStartDate((Date)weeklyPriorityDatesParamMap.get("ariaWeekStartDate"));
    itunesPriorityReportDates.setAriaWeekEndDate((Date)weeklyPriorityDatesParamMap.get("ariaWeekEndDate"));
    itunesPriorityReportDates.setitunesAccountPeriodStartDate((Date)weeklyPriorityDatesParamMap.get("itunesAccountPeriodStartDate"));
    itunesPriorityReportDates.setitunesAccountPeriodEndDate((Date)weeklyPriorityDatesParamMap.get("itunesAccountPeriodEndDate"));

    return itunesPriorityReportDates;

}

映射

    public ItunesPriorityReportDates getWeeklyPriorityDates(Map<String,Object> weeklyPriorityDatesParamMap);

Mapper XML。

    <select id="getWeeklyPriorityDates" parameterType="java.util.HashMap" statementType="CALLABLE">
    {CALL external_reporting.itunes_sales.get_weekly_priority_dates(#{reportRunDate                 mode=IN, jdbcType=DATE},
                                                                    #{ariaWeekStartDate             mode=OUT, jdbcType=DATE},
                                                                    #{ariaWeekEndDate               mode=OUT, jdbcType=DATE},
                                                                    #{itunesAccountPeriodStartDate  mode=OUT, jdbcType=DATE},
                                                                    #{itunesAccountPeriodEndDate    mode=OUT, jdbcType=DATE}
                                                                    )
    }
</select>

现在升级到mybatis-3.2.5之后,它将null作为DATE传递给Oracle过程。

你能帮我解决这个问题吗?不确定是否必须更新我的映射器XML并包含一些内容以告诉它正确解析。

我在java中使用java.util.Date。

由于 奇拉格

1 个答案:

答案 0 :(得分:0)

从Eduardo Macarron(myBatis开发人员)获得解决方案

我明白了。这是一个有趣的发现。看看你发布的表达。

{reportRunDate mode = IN,jdbcType = DATE},

没有逗号分隔属性名称和模式!

正在发生的事情是,3.0和3.1承认使用空格作为分隔符,虽然它没有记录,未经测试,至少在我的情况下未知:)

3.2解析代码得到了改进,现在它支持一个定义良好的语法:

  • 内联参数表达式解析器。支持的语法(简化):
    •  
  • inline-parameter =(propertyName | expression)oldJdbcType attributes
  • propertyName = / expression language的属性导航路径/
  • expression ='('/ expression language's expression /')'
  • oldJdbcType =':'/任何有效的jdbc类型/
  • attributes =(','attribute)*
  • attribute = name'='value

并且空格不是有效的分隔符(因此属性实际上可以称为“输入日期”)。

这种改变是不受欢迎的,但一年前在3.2中引入,所以恐怕我们不能回去了。

我希望你错过了逗号,这不是故意的。遗憾!