Spring 数据 R2DBC - 在反应性存储库中构建自定义 postgresql 查询
Spring Data R2DBC - Building custom postgresql query in reactive repository
我有一个 table,其中包含具有字符串 ID、字符串 jobId 和字符串状态的实体。给定一个 jobId 和一个 ID 列表,我想查询 table 和 return 数据库中不存在的 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 (, , )) AS a(id) LEFT JOIN (SELECT * FROM items WHERE job_id = 1) b ON a.id = b.id WHERE b.id IS null]
这总是 return 一个值,因为这些值被分组到一组括号中,而不是将我集合中的每个元素都放在括号中。只是好奇是否有办法正确处理这个问题。
编辑
实体 class 是:
@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
之类的事情并让它为您自动生成查询。
您可以通过将参数包装到 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);
另请参阅:
我有一个 table,其中包含具有字符串 ID、字符串 jobId 和字符串状态的实体。给定一个 jobId 和一个 ID 列表,我想查询 table 和 return 数据库中不存在的 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 (, , )) AS a(id) LEFT JOIN (SELECT * FROM items WHERE job_id = 1) b ON a.id = b.id WHERE b.id IS null]
这总是 return 一个值,因为这些值被分组到一组括号中,而不是将我集合中的每个元素都放在括号中。只是好奇是否有办法正确处理这个问题。
编辑 实体 class 是:
@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
之类的事情并让它为您自动生成查询。
您可以通过将参数包装到 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);
另请参阅: