我有一个代码,应该从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 才使用空白填充的比较语义。