mybatis的原因!!!!!
数据库这个样子
在postman中调用接口:SQL
select * from T_TRAIN_MARSHALLING where TRAIN_NUM is null and PRE_TRAIN_NUMBER is null and RECEIVE_SEND=#{RECEIVE_SEND} union all select * from T_TRAIN_MARSHALLING where TRAIN_NUM = #{TRAIN_NUM} and PRE_TRAIN_NUMBER is null
查询结果:
在SQLserver中的测试如下:
然后就开始找原因,解决方案就是加trim,这个很恶心,或者mybaits下就不要用char了
select * from T_TRAIN_MARSHALLING where TRAIN_NUM is null and PRE_TRAIN_NUMBER is null and trim(RECEIVE_SEND)=#{RECEIVE_SEND}
union all
select * from T_TRAIN_MARSHALLING where TRAIN_NUM = #{TRAIN_NUM} and PRE_TRAIN_NUMBER is null
最终解决方案,
在mapper-config中,注册你实现的转换器类,其中jdbcType可以指定的类型在Mybatis的枚举类org.apache.mybatis.type.JdbcType中有明确的定义,不能为该枚举以外的值,不然会出错。这里因为枚举中没有我们需要的XMLType类型,所以指定为UNDEFINED。(也可以不指定具体的类型,在使用时用typeHandler指定具体的类即可):
mybatis-config.xml中增加
<typeHandlers> <!--Oracle CHAR fix --> <typeHandler handler="cn.com.git.cbs.mybatis.typehandler.OracleCharStringTypeHandler" javaType="String" jdbcType="CHAR" /> </typeHandlers>
然后写一个转换的类
/* * @author XueWeiWei * @date 2019/8/14 14:01 */ public class OracleCharStringTypeHandler implements TypeHandler<String> { @Override public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException { OraclePreparedStatement ops = ps.unwrap(OraclePreparedStatement.class); ops.setFixedCHAR(i, parameter); } }