单个查询可以在 Spring Boot 中给出条件结果的结果吗?

Posted

技术标签:

【中文标题】单个查询可以在 Spring Boot 中给出条件结果的结果吗?【英文标题】:Can a Single Query give results for conditional outcomes in spring boot? 【发布时间】:2020-06-17 02:40:24 【问题描述】:

我遇到了一个问题,我希望使用单个查询而不是多个查询来显示多个结果。

假设一个表有 50 条记录和 3 列,可能需要 1 列,也可能不需要。当用户保持它为空时,Query1 返回 30 条记录,当用户给它一些值时,Query2 将返回 15 条记录。这可以仅使用一个查询来实现吗?

控制器:

public Iterable<Number> getNumberRecords(@PathVariable String one, @PathVariable String two,
                                          @RequestParam(value = "three", required = false) String three) 

if(three == null)
   return numberRepository.findAllbyOneAndTwo(one,two);
else
   return numberRepository.findAllbyOneAndTwoAndThree(one,two,three);


存储库:

@Repository
public interface NumberRepository extends CrudRepository<Number, Long>

List<Number> findAllbyOneAndTwoAndThree(String one, String two, String three);
List<Number> findAllbyOneAndTwo(String one, String two);


我只想要一个在这两种情况下都能满足并给出预期输出的查询。使用 @Query(" ") 的条件查询也可以。

【问题讨论】:

List&lt;? extends Number&gt; findAllByOneAndTwoAndThree(String one, String two, @Nullable String three);? (即只接受Stringnull 值(如果提供 isn't,spring 将提供该值。)然后你可以让你的代码构建查询 String 为是,带有if (three != null) queryBuilder.append(" AND WHERE a.someProperty = :three"); (或类似的东西)。(我假设queryBuilderStringBuilder 或类似的东西,但是做任何你想做的事情来附加到查询中。) @BeUndead if I keep Three Null 结果将为 Null,因为它是一个 AND 操作,如果我执行 OR 操作,当实际给 Three 一个值时,它只会给出所有存在三个的情况。 我在评论中添加的代码涵盖了这一点。您只需将子句添加到查询if (three != null) 【参考方案1】:

要将我的评论转换为答案,以下内容应涵盖您正在谈论的内容:

public List<? extends Number> findAllByOneTwoAndThree(final String one,
                                                      final String two,
                                                      final @Nullable String three) 
    final StringBuilder queryBuilder = new StringBuilder();

    queryBuilder.append("SELECT x FROM some_table x")
            .append(" WHERE x.one = :one")
            .append(" AND x.two = :two");

    if (three != null) 
        // Only add to the query if three was NOT null.
        queryBuilder.append(" AND x.three = :three");
    

    // etc...

【讨论】:

您不能将主体添加到接口抽象方法中.. :( 查找default方法:)

以上是关于单个查询可以在 Spring Boot 中给出条件结果的结果吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在mongo spring boot中默认为所有查询添加默认条件

如何根据postgres的jsonb列的where条件(无本机查询)使用jpa在spring boot中选择数据?

在Spring Boot中使用Spring-data-jpa实现分页查询(转)

Spring boot 之 使用JPA对数据进行复杂条件的查询

Spring Boot中的本机查询,列表中元组的WHERE条件

Spring Boot 和 JPA:使用可选的范围条件实现搜索查询