【问题标题】:This method must return a result of type Specification<Employee> in Java 8此方法必须返回 Java 8 中 Specification<Employee> 类型的结果
【发布时间】:2019-07-22 16:19:43
【问题描述】:

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

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));
    }
}

我遇到以下错误:

此方法必须返回规范类型的结果

@GetMapping("/findEmployees")
public ResponseEntity<List<Employee>> findEmployees(@RequestParam Object searchValue) {
    List<Employee> employees = employeeService.searchGlobally(searchValue);
    return new ResponseEntity<>(employees, HttpStatus.OK);
}

【问题讨论】:

    标签: java java-8 spring-data-jpa


    【解决方案1】:

    你可以这样做;

    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;
        }
    }
    

    map() 方法中隐藏if 逻辑...


    将您的端点更新为;

    findEmployees(@RequestParam String searchValue) { }
    

    因为所有输入都可以被接受为类型String

    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
    

    【讨论】:

    • 我还需要检查 Date 的实例。一旦你重构了这个条件,我会试试看
    • @Only 我在搜索 2 时看到的问题,然后运算符实例将其视为字符串。我已经展示了 RestEndpoint
    • 这是一个很有前途的解决方案.. 运行良好,但是我还没有检查日期,如果它不起作用,会检查并通知你
    • 我已经接受并赞成您的回答。小修改,应该使用2个不同的try-catch块,如果finalValue = Integer.parseInt(searchValue);中断,finalValue = parseDateFromStr(searchValue);将不会执行
    • @PAA 是的,当然,你是对的,更新了答案,感谢你的支持等。我只是想让你检查我的其他答案,也许你想要一些知道的人=P跨度>
    猜你喜欢
    • 2013-12-18
    • 2015-09-25
    • 1970-01-01
    • 2020-02-16
    • 2018-03-08
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多