Spring Data R2DBC-在反应式存储库中构建自定义postgresql查询

问题描述 投票:0回答:1

我有一个表,其中包含具有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列表,我想查询该表并返回非......>

spring spring-data-jpa spring-data spring-el spring-data-r2dbc
1个回答
0
投票

您可以通过将参数包装到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);
© www.soinside.com 2019 - 2024. All rights reserved.