我有一个简单的方法
public ResponseEntity<List<Item>> findAllByParameters(@RequestBody ListofParameters listOfParameters) {
log.info("Find All items with given parameter");
return ResponseEntity.ok(itemRepository.findAllBy(listOfParameters));
}
我的参数列表看起来像这样(现在只有1个字符串列表)
@Getter
@Setter
public class ListofParameters {
@NotNull
private List<String> colors;
我的存储库使用以下参数过滤数据库记录:
public interface ItemRepository extends CrudRepository<Item, String> {
@Query("SELECT it FROM Item it WHERE (it.color IS NULL OR it.color IN (:#{#listOfParameters.colors}))")
List<Item> findAllBy(@Param("listOfParameters") ListOfParameters listOfParameters);
}
现在,当参数匹配时,我会返回完整的对象列表,否则返回空列表。
类似地,如果我尝试找到3种颜色并且只匹配两种颜色,我将不会获得有关丢失的颜色的信息(只需获取两个对象的列表)。
问题是我想知道哪些项目不匹配。认为好的解决方案是返回一个包含两个对象列表的对象(一个匹配给定颜色,另一个不匹配)
有谁知道如何做到这一点?
答案 0 :(得分:0)
类似地,如果我尝试找到3种颜色并且只匹配两种颜色,我将不会获得有关丢失的颜色的信息(只需获取两个对象的列表)。 问题是我想知道哪些项目不匹配。
要知道缺少哪些项目,
假设,在数据库中包含颜色为(&#34;蓝色&#34;和&#34;红色&#34;)的项目。 您的请求包含(&#34;蓝色&#34;,&#34;红色&#34;和&#34;黄色&#34;)的颜色。 你想要的输出&#34;黄色&#34; (因为数据库没有&#34;黄色&#34;颜色)的任何项目
public void myMethod(){
ListOfParameters listOfParameters = new ListOfParameters();
listOfParameters.setColors(Arrays.asList("blue", "red", "yellow"));
// items with "red" and "blue" would return
List<item> items = ItemRepository.findAllBy(listOfParameters);
// convert List<item> into List<String> having color "red" and "blue"
List<String> includeColors = items.stream().map(Item.getColor()).collect(Collectors.toList());
// remove common color
listOfParameters.getColors().removeAll(includeColors)
o/p [yellow]
s.o.p(listOfParameters.getColors());
}