gpt4 book ai didi

java - JpaSpecificationExecutor 似乎不像 JpaRepository 那样工作

转载 作者:行者123 更新时间:2023-12-01 18:40:01 24 4
gpt4 key购买 nike

通常在使用 JpaRepository 接口(interface)时,我倾向于提及我将在服务类中使用的接口(interface)中的方法。示例:

public interface UserRepository extends JpaRepository<User, Integer> {

List<User> findAll(); // Usually I mention the methods this way in the interface.

}

这非常有效。但是,当使用 JpaSpecificationExecutor 接口(interface)时,如果我提到接口(interface)中的方法,它会抛出类似错误 - 无法创建查询方法...

如果我不提及该方法,它会按预期工作。有人可以解释一下 Spring 中的这种奇怪行为吗?

public interface UserRepository extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User> {

List<User> findAll(UserSpecification user); // If I do not mention this method here, it works perfectly.

}

最佳答案

  1. List<User> findAll()在扩展接口(interface)之一(即 JpaRepository<User, Integer> )中声明。只要签名相同,在扩展接口(interface)中重新声明方法就不是错误;它根本没有任何效果。这个事实与 Spring Data 无关;这就是 Java 的工作原理。

  2. List<User> findAll(UserSpecification) 在任何扩展接口(interface)中声明。请注意,通过实现 JpaSpecificationExecutor<User> ,您的接口(interface)将继承带有签名 List<User> findAll(Specification<User>) 的方法声明,这是不一样。这两种方法具有不同的签名,因为 Specification<User>UserSpecification 不同类型。

  3. 当然,您可以向存储库接口(interface)添加新方法只要它们代表简单查询,无需 Specification论据,例如User findByName(String name) Spring Data 将在运行时自动生成这些方法的实现

  4. 如果新方法的参数表示扩展 Specification 的自定义类型,则您无法向存储库接口(interface)添加新方法。 ,或 Spring Data 无法识别的任何其他类型,因为在运行时,Spring Data 将无法生成此类方法的实现 - 它根本不了解如何处理此类方法

根据规范,您应该使用 JpaSpecificationExecutor 的方法提供。我不明白你为什么想要像 List<User> findAll(UserSpecification user) 这样的方法,或者 - 如果 UserSpecification延伸Specification<User> ,那么继承的List<User> findAll(Specification<User>)会工作得很好。

关于java - JpaSpecificationExecutor<T> 似乎不像 JpaRepository<T, I> 那样工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59952102/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com