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