spring 查询中多列条件列表(批次种类)

jecbmhm3  于 2023-01-24  发布在  Spring
关注(0)|答案(1)|浏览(118)

当尝试搜索单个记录时,此查询有效

@Query(value = "select * from table t where t.column1 = :column1  and t.column2 = :column2 and t.column3 = :column3")
Flux<Invoice> findByMultipleColumn(@Param("column1”) String column1, @Param("column2”) String column2, @Param("column3”) String column3);

但是,当我有一个标准列表,而不是一个单行条件,然后我必须循环的标准列表和调用上述查询多次,这是不可行的解决方案。
须藤码

for (Criteria criteria : criteriaList) {
            repository.findByMultipleColumn(criteria.getColumn1(), criteria.getColumn2(), criteria.getColumn3());
        }

我试图找到一种方法来解决上述查询的多个列表的所有3列条件对,如下所示(这不是工作解决方案

@Query(value = "select * from table t where t.column1 = :column1  and t.column2 = :column2 and t.column3 = :column3")
Flux<Invoice> findByMultipleColumn(@Param List<Table> table);

有没有什么方法可以达到上述的情况呢?

toe95027

toe950271#

如果第1、2和3列是嵌入式的,则可以执行

@Query(select * from Entity where embeddedProperty in (:values))
Flux<Entity> findByEmbeddedPropertyIn(Collection<EmbeddedClas> values);

这将生成以下本机SQL子句

Where (column1, column2, column3) in ((x, y, z), ...)

如果您不想将这些字段i打包到可嵌入类中,您也可以尝试做一个变通方案

@Query(select * from Entity where Concat(column1, ';', column2, ';', column3) in (:parametersConcatrenatedInJava)
Flux<Entity> findBy3Columns(Collection<String> parametersConcatrenatedInJava);

它当然不是防弹的,三根柱子都可以“;“作为它们的值,如果它们的类型不是字符串等,则可能会出现问题。
编辑:
第三种选择是使用规范API。使用条件构建器,您可以连接多个查询和/或查询。并将规范作为参数传递给扩展JpaSpecificationExecutor的存储库(如果要获取整个实体)或实体管理器(如果要使用投影)。Read more about specifications

相关问题