java - 在 Java 8 中,此方法必须返回 Specification<Employee> 类型的结果

标签 java java-8 spring-data-jpa

如何使用 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));
    }
}

我收到以下错误:

This method must return a result of type Specification

@GetMapping("/findEmployees")
public ResponseEntity<List<Employee>> findEmployees(@RequestParam Object searchValue) {
    List<Employee> employees = employeeService.searchGlobally(searchValue);
    return new ResponseEntity<>(employees, 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;
    }
}

隐藏 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

关于java - 在 Java 8 中,此方法必须返回 Specification<Employee> 类型的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57139530/

相关文章:

java - 如何使用 Java 中的 xslt 从纯文本中读取所有数据?

java - 在模块 jetified-guava-26.0-android.jar 中发现重复的类 com.google.common.util.concurrent.ListenableFuture

java - 接口(interface)方法引用的注释信息

java - 有没有一种方法可以使用Java 8中的流来合并列表中的重复数字?

java - JPA:仅更新特定字段

java - Spring JPA @Query注解,SQL地理定位错误

java - 将响应从 ServerResource 流式传输回客户端

java - 如何在 Java 中禁用 ButtonGroup 内的 JRadioButton

java8 流不会更改类成员

java - 使用分页时,在 spring jpa native 查询中,'select count(*) from' 被替换为 'select count(where)'