单个查询可以在 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<? extends Number> findAllByOneAndTwoAndThree(String one, String two, @Nullable String three);
? (即只接受String
的null
值(如果提供 isn't,spring 将提供该值。)然后你可以让你的代码构建查询 String
为是,带有if (three != null) queryBuilder.append(" AND WHERE a.someProperty = :three");
(或类似的东西)。(我假设queryBuilder
是StringBuilder
或类似的东西,但是做任何你想做的事情来附加到查询中。)
@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对数据进行复杂条件的查询