Собственный запрос JPA ставит неправильные скобки для параметра списка в INSERT INTO VALUES - PullRequest
0 голосов
/ 15 мая 2019

Итак, я пытаюсь написать собственный именованный запрос для JPA (JPQL) в INSERT несколько строк данных за один раз и получить обратно все идентификаторы вставленных записей (которые не конфликтуют с уникальным ограничением наосновной ключ).Я использую базу данных Postgres.

База данных выглядит следующим образом: SELECT * FROM table;

id | sent
---+------
1  | f
(1 row)

Чего я хотел бы добиться, так это оператора PSQL:

INSERT INTO table VALUES (1, false),(2, false) ON CONFLICT DO NOTHING RETURNING id;

Который должен возвращать:

id
---
2
(1 row)

Поэтому моей первоначальной идеей было сделать собственный запрос в JPA:

@Repository
interface NotificationRepository : JpaRepository<Foo, Int> {

    @Modifying
    @Query("INSERT INTO Foo VALUES (:foos) ON CONFLICT DO NOTHING RETURNING id", nativeQuery = true)
    fun addAllAndReturnInserted(foos: List<Foo>): List<Int>
}

, который работает для одного значения в списке, но для нескольких значений он создаст запрос вроде:

Hibernate: INSERT INTO Foo VALUES (?, ?) ON CONFLICT DO NOTHING RETURNING id

И он выдаст исключение:

PSQLException: ОШИБКА: столбец «отправлено»имеет тип boolean, но выражение имеет тип int

Есть ли способ преобразовать список в отдельные perentheses, такие как (?), (?) вместо одного (?, ?) ??

1 Ответ

2 голосов
/ 15 мая 2019

Нет, ваша идея хороша, но не будет работать с Spring Data, потому что:

  1. расширение списка параметров происходит только как разделенный запятыми список значений данных (a, b, ...), а не списокзаписи или строки (a), (b), (...)
  2. операторы изменения данных, которые возвращают что-то, также не поддерживаются (пока): https://jira.spring.io/browse/DATAJPA-1389

Однако существует обходной путь по крайней мере для пакетированияпроблема, как описано здесь:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...