此方法必须返回类型规范的结果<;员工>;在Java8中
如何使用if-else返回Lambda表达式此方法必须返回类型规范的结果<;员工>;在Java8中,java,java-8,spring-data-jpa,Java,Java 8,Spring Data Jpa,如何使用if-else返回Lambda表达式 public static Specification<Employee> textInAllColumns(Object value) { if (value instanceof String) { return (root, query, builder) -> builder .or(root.getModel().getDeclaredSingularAttributes()
public static Specification<Employee> textInAllColumns(Object value) {
if (value instanceof String) {
return (root, query, builder) -> builder
.or(root.getModel().getDeclaredSingularAttributes().stream()
.filter(a -> {
return a.getJavaType()
.getSimpleName()
.equalsIgnoreCase("String") ? true : false;
})
.map(a -> builder.like(root.get(a.getName()), getString((String) value)))
.toArray(Predicate[]::new));
} else if (value instanceof Integer) {
return (root, query, builder) -> builder
.or(root.getModel().getDeclaredSingularAttributes().stream()
.filter(a -> {
return a.getJavaType()
.getSimpleName()
.equalsIgnoreCase("Integer") ? true : false;
})
.map(a -> builder.equal(root.get(a.getName()), value))
.toArray(Predicate[]::new));
}
}
公共静态规范textInAllColumns(对象值){
if(字符串的值实例){
返回(根、查询、生成器)->builder
.或(root.getModel().getDeclaredSingularAttributes().stream())
.过滤器(a->{
返回a.getJavaType()
.getSimpleName()
.equalsIgnoreCase(“字符串”)?真:假;
})
.map(a->builder.like(root.get(a.getName()),getString((String)value)))
.toArray(谓词[]::new));
}else if(整数的值实例){
返回(根、查询、生成器)->builder
.或(root.getModel().getDeclaredSingularAttributes().stream())
.过滤器(a->{
返回a.getJavaType()
.getSimpleName()
.equalsIgnoreCase(“整数”)?真:假;
})
.map(a->builder.equal(root.get(a.getName()),value))
.toArray(谓词[]::new));
}
}
我得到以下错误:
此方法必须返回指定类型的结果
@GetMapping(“/findeEmployees”)
公共响应findEmployees(@RequestParam对象searchValue){
列出员工=employeeService.SearchGlobal(searchValue);
返回新的ResponseEntity(员工,HttpStatus.OK);
}
您可以这样做
public static Specification<Employee> textInAllColumns(Object value) {
return (root, query, builder) -> builder.or(root.getModel().getDeclaredSingularAttributes().stream()
.filter(attr -> attr.getJavaType().equals(value.getClass()))
.map(attr -> map(value, root, builder, attr))
.toArray(Predicate[]::new));
}
private static Object map(Object value, Root root, CriteriaBuilder builder, SingularAttribute a) {
switch (value.getClass().getSimpleName()) {
case "String":
return builder.like(root.get(a.getName()), getString((String) value));
case "Integer":
return builder.equal(root.get(a.getName()), value);
case "Date":
return //date mapping
default:
return //default;
}
}
因为所有输入都可以接受为类型字符串
Object finalValue = searchValue;
try {
finalValue = Integer.parseInt(searchValue);
} catch (Exception e) {
// ignore
}
try {
finalValue = parseDateFromStr(searchValue);
} catch (Exception e) {
// ignore
}
// use finalValue as input to your logic, it will contain correct type
我还需要执行日期检查。一旦你重构了这个,我会尝试一下condition@Only我在搜索2时看到的问题,然后操作符的实例将其视为字符串。我已经证明这是一个很有希望的解决方案。。工作很好,但我还没有检查日期,我会检查,并让你知道,如果它不工作,我已经接受并投票赞成你的答案。如果finalValue=Integer.parseInt(searchValue),则应使用两个不同的try-catch块进行小修改代码>中断,finalValue=parseDateFromStr(searchValue)代码>将不会execute@PAA是的,当然,你是对的,更新了答案,谢谢你的投票等等。我只是想让你检查我的其他答案,也许你会想要一些谁知道=P
findEmployees(@RequestParam String searchValue) { }
Object finalValue = searchValue;
try {
finalValue = Integer.parseInt(searchValue);
} catch (Exception e) {
// ignore
}
try {
finalValue = parseDateFromStr(searchValue);
} catch (Exception e) {
// ignore
}
// use finalValue as input to your logic, it will contain correct type