强制存储库接口具有某些方法

Enforce repository interfaces to have certain methods

我有一个存储库:

狗:

public interface DogRepository extends JpaRepository<Dog, Long> {

    @Query("select d from Dog d where ?1 MEMBER OF d.owners")
    List<Dog> findAllForUser(String user);

    @Query("select d from Dog d where ?1 MEMBER OF d.owners and d.id = ?2")
    Dog findOneForUser(String user, Long id);
}

我想要一个强制创建 findAllForUser 和 findOneForUser 的 RestrictedRepository:

@NoRepositoryBean
public interface RestrictedRepository<T, ID extends Serializable> extends JpaRepository<T, ID>{
    List<T> findAllForUser(String user)
    T findOneForUser(String user, Long id);
}

并且我希望 Dog 存储库扩展它而不是 JpaRepository。然而,每次我这样做时,我都会得到一个例外:

org.springframework.data.mapping.PropertyReferenceException: 未找到 Dog 类型的属性 findOneForUser!

从 RestrictedRepository 中删除 findOneForUser 方法解决了这个问题,我的 findAllForUser 工作正常。

完整代码示例可在 https://github.com/imduffy15/spring-boot-sample-data-jpa 处获得,导致异常的代码已被注释掉。

是什么导致了这些异常,我该如何修复或解决它?

从推特上的@thought_forge 得到了答案。

移动到:

@NamedQuery(name="Dog.findOneForUser", query="select d from Dog d where ?1 MEMBER OF d.owners and d.id = ?2")

在域资源上而不是在存储库上,异常消失并且应用程序按预期执行。

@Query 可能存在错误。

我将相应地更新链接的 github 示例。