Метод запроса данных Spring с ключевым словом IN с использованием списка перечислений в качестве параметраJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Метод запроса данных Spring с ключевым словом IN с использованием списка перечислений в качестве параметра

Сообщение Anonymous »

Я использую репозиторий Spring Data JPA (4.3.5) и метод запроса с использованием ключевого слова IN с полем List в качестве параметра. Проблема в том, что он работает не так, как я ожидал.

Для такого объекта, как:

Код: Выделить всё

@Entity
@Table(name = "R_REPRESENTACIO")
public class Representacio {

@Enumerated(EnumType.STRING)
private Estat estat;

...
//getters and setters
...
}
С этим объявлением SQL:

Код: Выделить всё

CREATE TABLE R_REPRESENTACIO (
UUID NUMBER(19) NOT NULL,
...
ESTAT VARCHAR2(255) NULL,
...
);
— это класс Enum, например:

Код: Выделить всё

public enum Estat {
VALIDA,
PENDENT_VALIDACIO,
PENDENT_DOCUMENTACIO,
...
}
И репозиторий JPA, например:

Код: Выделить всё

public interface RepresentacioRepository extends JpaRepository {
List findAllByEstatIn(List estats);
}
Когда я запускаю (класс интеграционного теста):

Код: Выделить всё

List estats =
Arrays.asList(Estat.VALIDA,Estat.PENDENT_DOCUMENTACIO,Estat.PENDENT_VALIDACIO);
List allByEstatIn = representacioRepository.findAllByEstatIn(estats);
Сгенерированный SQL (в базе данных H2 в памяти):

Код: Выделить всё

2018-08-01 12:30:48.534--ServerSession(1175154004)--Connection(384887832)--Thread(Thread[main,5,main])--SELECT UUID, .... FROM R_REPRESENTACIO WHERE (ESTAT IN ((?,?,?)))
bind => [VALIDA, PENDENT_DOCUMENTACIO, PENDENT_VALIDACIO]
Исключение SQL не генерируется и возвращаются нулевые результаты.
Но это ДОЛЖНО вернуть 1 результат, поскольку этот (эквивалентный) SQL возвращает:

Код: Выделить всё

SELECT count(*) FROM R_REPRESENTACIO WHERE ESTAT IN ('VALIDA','PENDENT_DOCUMENTACIO','PENDENT_VALIDACIO');

COUNT(*)
----------
1
Уникальная разница, которую я вижу, заключается в том, как я заключаю аргументы предложения IN между '' (этот столбец представляет собой VARCHAR).

Я не знаю, почему сгенерированный SQL из репозитория JPA не возвращает результаты.
(Я также пробовал findAllByEstatIsIn(List estats) с тем же нулем результаты возвращены).

Есть предложения/объяснения?

PS: обходной путь (не устраивает) с использованием

Код: Выделить всё

List findAllByEstatOrEstatOrEstat(Estat estat, Estat estat2, Estat estat3);
но это во многом некрасиво и неправильно...

Подробнее здесь: https://stackoverflow.com/questions/516 ... -parameter
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»