我有一个表,其中包含具有String ID,String jobId和String状态的实体。给定一个jobId和一个ID列表,我想查询该表并返回数据库中不存在的ID通量。
如果我在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
响应仅返回不存在的ID,'abc'和'fdjk'。
在我的spring数据仓库中,定义以下方法:
@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当前不支持更成熟的spring数据仓库的幻想,因此您无法执行
findByJobId
之类的操作并让它自动为您生成查询。
我有一个表,其中包含具有String ID,String jobId和String状态的实体。给定一个jobId和一个ID列表,我想查询该表并返回非......>
您可以通过将参数包装到Object[]
中以将参数呈现为表达式列表来强制执行括号。
interface MyRepo {
@Query(…)
Flux<ItemId> getNotContains(@Param("jobId") String jobId, @Param("ids") Collection<Object[]> ids);
}
MyRepo myRepo = …;
Collection<Object[]> ids = Arrays.asList(new Object[]{"1"}, new Object[]{"2"});
myRepo.getNotContains("foo", ids);