尝试使用 myBatis 中的单个参数从视图中检索信息时,结果为 null.使用静态查询时,它可以工作



我有一个代码,应该从Oracle数据库的视图中检索一些数据(使用mybatis(。

这是一个动态查询,接收一个参数

愚蠢的代码示例:

//Repo Class
@Select("select surname, name from vw_example where name=#{name}")
@Results({
        @Result(property = "surname", column = "surname"),
        @Result(property = "name", column = "name"),
})
public List<Result> getSurname(@Param("name") String id)
//Test Class
@Autowired RepoClass repo;
@Test
public void testGetSurname(){
List<Result> result = repo.getSurname("Danilo");
AssertThat(result.size(),is(2));
}

重要的事情(在我正在处理的数据库中,名称列是 CHAR[40](请不要问为什么......但我无法更改它(。

考虑到有 2 条记录包含"Danilo"作为数据库中"名称"列的值,它应该为我返回 2 行并映射到对象"结果"。

但是,它并没有发生。断言附带实际:0

现在,疯狂的事情...

如果我更改此设置:

@Select("select surname, name from vw_example where name=#{name}")

对此:

@Select("select surname, name from vw_example where name='Danilo'")

它就像一个魅力!

信息:(我已经尝试传递jdbcType (#{name,jdbcType=CHAR((

(似乎正在替换参数,因为我用参数值替换了 Insert 的 Select 语句,并且它运行良好(

有人可以帮助解决这种疯狂的事情吗?谢谢

当列声明为 CHAR(40) 时,数据库中的数据用空格填充。

选项 1:在 Java 代码中添加空格。

List<Result> result = repo.getSurname(String.format("%-40s", "Danilo"));

选项 2 :在查询中强制转换参数。

select surname, name from vw_example where name = cast(#{name} as char(40))

查询的文字版本之所以有效,是因为使用了空白填充的比较语义,我猜。

对于空白填充语义,如果两个值具有不同的长度,则 Oracle 首先在较短值的末尾添加空白,以便它们的长度相等。(截图(如果两个值没有不同的字符,则认为它们相等。此规则意味着,如果两个值仅在尾随空白的数量上不同,则它们相等。仅当比较中的两个值都是数据类型为 CHAR、NCHAR、文本文本或 USER 函数返回的值的表达式时,Oracle 才使用空白填充的比较语义。

最新更新