此方法必须返回类型规范的结果<;员工>;在Java8中

此方法必须返回类型规范的结果<;员工>;在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()

如何使用if-else返回Lambda表达式

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