Question

I was using mybatis-3.1.1 and there was no issue in the following code.

DAO Implementation

    @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;

}

Mapper

    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>

After upgrading to mybatis-3.2.5 now it is passing null as DATE to Oracle procedure.

Can you please help me with this? Not sure whether I have to update my mapper XML and include something to tell it to parse correctly.

I am using java.util.Date in java.

Thanks Chirag

Was it helpful?

Solution

Got solution from Eduardo Macarron (myBatis developer)

I got it. It is an interesting finding. Have a look at the expression you posted.

{reportRunDate mode=IN, jdbcType=DATE},

There is no comma separating the property name and the mode!

What is happening is that 3.0 and 3.1 admitted using an space as a separator, though that was undocumented, untested and at least in my case unknown :)

3.2 parsing code was improved and now it supports a well defined grammar:

  • Inline parameter expression parser. Supported grammar (simplified):
  • inline-parameter = (propertyName | expression) oldJdbcType attributes
  • propertyName = /expression language's property navigation path/
  • expression = '(' /expression language's expression/ ')'
  • oldJdbcType = ':' /any valid jdbc type/
  • attributes = (',' attribute)*
  • attribute = name '=' value

And the space is not a valid separator (so properties can in fact be called "input date").

This change was unwanted but was introduced in 3.2 one year ago so I am afraid we cannot go back.

I hope you just missed the comma and that was not intentional. Sorry!

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top