Преобразование данных Spring Boot H2 - PullRequest
0 голосов
/ 02 февраля 2019

Версия Spring Boot: 2.1.2.RELEASE
Версия H2: 1.4.197
Запрос через JpaRepository:

@Repository
public interface PlayerStorage extends JpaRepository<Player, Long> {
  List<Player> findByUid(@Param("uid") List<Integer> uid);
}
...
List<Player> foundByUids = playerStorage.findByUid(Arrays.asList(100, 200));

Spring создает и выполняет запрос:

Data conversion error converting "(100, 200)"; SQL statement:
select
        player0_.id as id1_3_,
        player0_.uid as uid3_3_ 
    from
        player player0_ 
    where
        player0_.uid=(100 , 200)
[22018-197]
...
Caused by: java.lang.NumberFormatException: For input string: "(100, 200)"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:569)
at java.lang.Integer.parseInt(Integer.java:615)
at org.h2.value.Value.convertTo(Value.java:1061)

H2 говорит:

DATA_CONVERSION_ERROR_1 = 22018
The error with code 22018 is thrown when trying to convert a value to a data type where the conversion is undefined, or when an error occurred trying to convert.
Example:
CALL CAST(DATE '2001-01-01' AS BOOLEAN);
CALL CAST('CHF 99.95' AS INT);

Я получаю тот же результат, если пытаюсь выполнить этот запрос непосредственно из веб-консоли H2.Если я правильно понял, проблема в утверждении: player0_.uid=(100 , 200).Тот же запрос с in player0_.uid in (100 , 200) прекрасно выполняется с веб-консоли.

Также у меня есть свойства весенней загрузки для H2:

spring.datasource.driver-class-name=org.h2.Driver
spring.jpa.database=H2
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Возможно, ошибка в коде репозитория:

public interface PlayerStorage extends JpaRepository<Player, Long> {
  List<Player> findByUid(@Param("uid") List<Integer> uid);
}

Из документации должно быть:

public interface PlayerStorage extends JpaRepository<Player, Long> {
  List<Player> findByUidIn(@Param("uid") List<Integer> uid);
}

Также:

  • если в проигрывателе поле "uid", то @Param не требуется
  • @ Репозиторий также избыточен
  • Я бы предложил добавить некоторую проверку того, что список, переданный методу:не пусто, иначе это приведет к исключению.
0 голосов
/ 02 февраля 2019

Попробуйте переименовать ваш метод в

List<Player> findByUidIn(@Param("uids") List<Integer> uids);
...