当前位置: 首页 > 知识库问答 >
问题:

如何在带有多个可空参数的Spring Data JPA中编写查询?

孔鸿宝
2023-03-14
class EntityClass {
    UUID id;
    String param1, param2, param3;
    //Getters and Setters
}
class ServiceClass {
    List<EntityClass> getAllBy(List<String> param1, List<String> param2, String param3) {
        return repositoryInterface.customFindAll(param1, param2, param3);
    }
}
interface RepositoryInterface extends JpaRepository<EntityClass, UUID> {
    @Query(value = "FILL THE QUERY", nativeQuery = true)
    List<EntityClass> customFindAll(@Param("param1") List<String> param1, @Param("param2") List<String> param2, @Param("param3") String param3)
}

共有1个答案

马弘益
2023-03-14

一般的方法是使用如下所示的where子句:

WHERE (:param1 IS NULL OR param1 IN :param1) ...

但是我不认为您可以对列表值绑定参数执行is null检查。但是您可以为此使用SpEL表达式。

这应该能起到作用:

SELECT id, param1, param2, param3
FROM EntityClass
WHERE (:#{#param1 == null ? 0 : 1} = 0 OR param1 IN :param1) 
AND   (:#{#param2 == null ? 0 : 1} = 0 OR param2 IN :param2) 
AND   (:#{#param3 == null ? 0 : 1} = 0 OR param3 IN :param3) 
( param1 IN :#{(#param1 == null || #param1.isEmpty()) ? java.util.Collections.singletonList(#param1) : #param1})
 类似资料:
  • 问题内容: 我想使用angularjs HTTP post service发送多个参数。 这是客户端代码: 这是服务器端代码: 但是当我发表文章时,我得到了错误。知道我在做什么错吗? 问题答案: 考虑带有参数 user* 和 email 的帖子URL * params对象将是

  • 问题内容: 我知道关于从Java执行流程有很多解决的问题,但是我无法使用提供的答案解决问题。我正在尝试从Java应用程序创建postgresql数据库备份。我使用以下代码 执行以上代码后,出现以下错误: 仅当备份文件的路径包含空格时才出现问题,否则将创建备份。我试图在文件路径中同时使用斜杠和反斜杠,但我引用了文件路径,但每次都遇到相同的错误。可以从命令提示符处执行命令。 我做错了。关于Proces

  • 问题内容: 假设上一课,您如何找到具有特定电子邮件地址的? 这样做简单吗,还是有适当的方法? 问题答案: 那并没那么简单。JPQL 为此提供了运营商: “旧”方式(类似于SQL)是:

  • 问题内容: 我正在使用JPA 2.0。Hibernate 4.1.0.Final和Java6。如何从以下psuedo-SQL编写JPA查询? 我的域对象如下所示: 我知道涉及CriteriaBuilder.greatest,但是我只是不知道如何编写查询。这将返回所有与组织匹配的事件对象,但据我所知。 问题答案: 有两种方法,一种使用JPQL,另一种使用条件查询。 JPQL就是: 使用条件时,您可能

  • 问题内容: 使用Hibernate时,有什么方法可以在命名查询中指定可选参数(例如,从表单提供搜索参数而并非所有参数都是必需的)?我正在使用本机SQL查询,但该问题可能也适用于命名HQL查询。 我很确定对此的答案是“否”,但是我还没有在文档中找到确切的答案。 问题答案: AFAIK,没有这样的事情,因此您必须为此编写一个动态查询。也许看一下以前的答案,该答案显示了如何在HQL中执行此操作(您可以将

  • 我遇到了这样一种情况,我的映射方法有3个参数,所有这三个参数都用于派生目标类型的一个属性。 我在接口中创建了一个默认映射方法,保留了用于派生属性的逻辑,现在为了调用这个方法,我可以在注释中使用。 有没有什么方法可以在mapstruct注释中做到这一点,比如,我试着用expression属性和qualifiedByName来注释注释,但它不起作用: