Spring Data R2DBC - Создание пользовательского запроса postgresql в реактивном репозитории - PullRequest
0 голосов
/ 02 октября 2019

У меня есть таблица, которая содержит объекты с идентификатором String, идентификатором String jobId и статусом String. Учитывая jobId и список идентификаторов, я хотел бы запросить эту таблицу и вернуть поток идентификаторов, которых нет в базе данных.

Я могу сделать это успешно, если вручную выполнить следующий запрос в pgadmin:

SELECT a.id FROM (VALUES ('20191001_182447_1038'),('abc'),('fdjk')) AS a(id) LEFT JOIN (SELECT * FROM items WHERE job_id = '10a7a04a-aa67-499a-83eb-0cd3625fe27a') b ON a.id = b.id WHERE b.id IS null

Ответ возвращается только с отсутствующими идентификаторами, 'abc' и 'fdjk'.

В моем весеннем репозитории я определяю следующий метод:

    @Query("SELECT a.id FROM (VALUES (:ids)) AS a(id) LEFT JOIN (SELECT * FROM items WHERE job_id = :jobId) b ON a.id = b.id WHERE b.id IS null")
    Flux<ItemId> getNotContains(@Param("jobId") String jobId, @Param("ids") Collection<String> ids);

Проблема в том, что когда я запускаю код, запрос расширяется до:

SELECT a.id FROM (VALUES ($1, $2, $3)) AS a(id) LEFT JOIN (SELECT * FROM items WHERE job_id = $251) b ON a.id = b.id WHERE b.id IS null]

Это всегда возвращает одно значение, поскольку значения группируются в один наборскобки вместо того, чтобы заключать каждый элемент моей коллекции в скобки. Просто любопытно, есть ли способ справиться с этим правильно.

РЕДАКТИРОВАТЬ Класс сущности:

@Data
@Table("items")
public class Item implements Persistable {

    @Id
    private String id;
    private String jobId;
    private String customerId;
    private Date queuedDate;
    private Date lastUpdated;
    private String destination;
    private String type;
    private Status status;
}

Кроме того, мой репозиторий:

public interface ItemRepository extends R2dbcRepository<Item, String>

R2dbcRepository notn 'В настоящее время он не поддерживает магию более зрелых репозиториев данных Spring, поэтому вы не можете делать такие вещи, как findByJobId, и он автоматически генерирует запрос для вас.

...