当前位置: 首页 > 知识库问答 >
问题:

Spring Data Jpa-不推荐使用类型规范

石苏燕
2023-03-14

我正在实现link:Spring data-multi-column searches中的逻辑,我希望通过firstname进行搜索。

根据链接:https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/domain/specifications.html

java

public class EmployeeSpecification {
    public static Specification<Employee> textInAllColumns(String text) {
        if (!text.contains("%")) {
            text = "%" + text + "%";
        }
        final String finalText = text;

        return new Specification<Employee>() {
            @Override
            public Predicate toPredicate(Root<Employee> root, CriteriaQuery<Employee> cq, CriteriaBuilder builder) {
                return builder.or(root.getModel().getDeclaredSingularAttributes().stream().filter(a -> {
                    if (a.getJavaType().getSimpleName().equalsIgnoreCase("string")) {
                        return true;
                    } else {
                        return false;
                    }
                }).map(a -> builder.like(root.get(a.getName()), finalText)).toArray(Predicate[]::new));
            }
        };
    }
}
public interface EmployeeRepository extends JpaRepository<Employee, Long>{
    List<Employee> findAll(Specification<Employee> spec);
}
@Service
@Slf4j
public class EmployeeServiceImpl implements EmployeeService {
    @Autowired
    private EmployeeRepository employeeRepository;

    @Override
    public void findAllCustomersByFirstName(String firstName) {
        employeeRepository.findAll(Specifications.where(EmployeeSpecification.textInAllColumns(firstName)));
    }
}

错误:

在这一行有多个标记-类型规范中的(规范)不适用于参数(规范)的方法-类型规范是不推荐的

共有1个答案

濮泳
2023-03-14

您的repo代码需要扩展JPaspecificationExecutor,如下所示:

public interface EmployeeRepository extends JpaRepository<Employee, Long>, 
    JpaSpecificationExecutor<Employee> {
}

JpaSpeficationExecutor有以下可以调用的方法:

public interface JpaSpecificationExecutor<T> {
    Optional<T> findOne(@Nullable Specification<T> var1);

    List<T> findAll(@Nullable Specification<T> var1);

    Page<T> findAll(@Nullable Specification<T> var1, Pageable var2);

    List<T> findAll(@Nullable Specification<T> var1, Sort var2);

    long count(@Nullable Specification<T> var1);
}

然后你可以做:

public void findAllCustomersByFirstName(String firstName) {
    employeeRepository.findAll(
            EmployeeSpecification.textInAllColumns(firstName)
    );
}
public class EmployeeSpecification {
    public static Specification<Employee> textInAllColumns(String text) {
        if (!text.contains("%")) {
            text = "%" + text + "%";
        }
        final String finalText = text;

        return  (Specification<Employee>) (root, query, builder) -> 
                builder.or(root.getModel().getDeclaredSingularAttributes().stream().filter(a -> {
                if (a.getJavaType().getSimpleName().equalsIgnoreCase("string")) {
                    return true;
                } else {
                    return false;
                }
            }).map(a -> builder.like(root.get(a.getName()), finalText)).toArray(Predicate[]::new));
    }
}
 类似资料:
  • 问题内容: 文档说 该类已被弃用。有人可以建议我替代吗? 我在我的代码中这样使用它: 问题答案: 如果仔细阅读文档,您会发现应该使用它作为替代。 例如: 请注意,该类有多个构造函数,您可以通过它们提供 mimeType , content type 等。 在将 构建说明 传递给构建器之后,您可以通过调用方法来构建:

  • 我正在做一个项目,我的问题是WebSecurityConfigrerAdapter。它不起作用。上面写着“WebSecurityConfigrerAdapter类型已弃用”你知道为什么吗?你能帮我吗?我不知道该怎么办

  • 我正在使用Spring Boot 2.4.2版,并使用进行Spring Cloud Stream和Spring集成。 RabbitmqReceiverApplication.java 还有什么替代方案?那么如何重构上面的代码呢?随着速度的加快,很多事情正在发生,很难理解什么来了,什么走了?

  • 以及如何提供其值?

  • 问题内容: 我可以用什么代替? 不建议使用此方法。在每个示例中,我都可以发现他们使用了此构造器或另一个不推荐使用的构造器。 问题答案: 不建议* 手动构建对象。请改为实例化一个。 * 从 Connection中 ,使用Connection.getTable(TableName)检索表实现。 例:

  • 问题内容: 我收到此警告,但是该程序仍然可以正常运行。 MySQL代码向我显示了一条PHP消息: 不推荐使用:mysql_connect():不推荐使用mysql扩展,以后将被删除:在第2行的C:\ xampp \ htdocs \ task \ media \ new \ connect.inc.php中使用mysqli或PDO代替 我的页面是 这是什么意思,我该如何消除该消息? 问题答案: 有