Spring JPA:如何禁用某些方法的查询创建

tru*_*ian 10 java spring jpa kotlin

我有一个自定义存储库,声明如下(用 Kotlin 编写):

interface FooRepository : JpaRepository<Foo, Int> {
    fun findByFoo(foo: String): List<Foo>

    fun findByBar(bar: String): List<Foo> {
        //custom implementation
    }
}

data class Foo(var id: Int, var foo: String, var bar: String)
Run Code Online (Sandbox Code Playgroud)

这两种方法都满足 JPA 存储库的命名约定,但我想FooRepository.findByBar自己实现第二种方法 ( )。如何防止 JPA 为其创建查询?
请注意,我的自定义实现涉及计算逻辑,因此@Query允许自定义查询的注释不满足我的要求。
此外,在实际情况下,这样做是必要且合理的,因此如果您试图建议“更好”的设计模式(例如将实现放在服务层等),请不要发布您的答案或评论。

小智 0

您可以简单地创建另一个接口(例如)FooRepositoryCustom,并为该接口创建一个实现类(FooRepositoryCustomImpl),然后在该类上进行实现FooRepositoryCustomImpl并将该FooRepositoryCustom接口扩展为您的FooRepository接口。

FooRepositoryCustom

public interface FooRepositoryCustom {
    fun findByBar(bar: String): List<Foo>;
}
Run Code Online (Sandbox Code Playgroud)

FooRepositoryCustomImpl

public class FooRepositoryCustomImpl implements FooRepositoryCustom {
    @Override
    public fun findByBar(bar: String): List<Foo> {
          //your implementation goes here
    }
}
Run Code Online (Sandbox Code Playgroud)

FooRepository

interface FooRepository : JpaRepository<Foo, Int>, FooRepositoryCustom {

}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回答。这个解决方案确实有效,但是我自己实现的方法将丢失 JpaRepository&lt;Foo, Int&gt; 的上下文,这不是有意的。 (5认同)