При попытке извлечь информацию из View с помощью одного параметра в myBatis, результат будет нулевым. При использовании статического запроса это работает - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть код, который должен получить некоторые данные из представления в базе данных 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))

(Кажется, параметр заменяется, потому что я заменил оператор Select для вставки значением параметра, и он работает нормально)

Может ли кто-нибудь помочь с этим сумасшедшим? Спасибо

1 Ответ

0 голосов
/ 04 апреля 2019

Поскольку столбец объявлен как 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 сначала добавляет пробелы в конец более короткого, чтобы их длины были равны.(фрагмент) Если два значения не имеют разных символов, они считаются равными.Это правило означает, что два значения равны, если они отличаются только количеством конечных пробелов.Oracle использует семантику сравнения с пустыми отступами, только когда оба значения в сравнении являются либо выражениями типа данных CHAR, NCHAR, текстовыми литералами, либо значениями, возвращаемыми функцией USER.

...