【问题标题】:Spring JPA: How to disable query creation for certain methodSpring JPA:如何禁用某些方法的查询创建
【发布时间】:2022-07-15 16:31:10
【问题描述】:

我有一个如下声明的自定义存储库(用 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)

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

【问题讨论】:

  • 如果您想禁用查询创建,那么您只需打破该方法的 Spring 命名约定,因此不要将 findByBar 命名为 searchByBarfetchByBar 之类的名称
  • @NikolaiShevchenko 感谢您的解决方案,但效果不佳。当我将它重命名为fetchByBar 时,我仍然得到一个QueryCreationException,说:没有为类型'Foo' 找到属性'fetchByBar'!

标签: java spring kotlin jpa


【解决方案1】:

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

FooRepositoryCustom:

public interface FooRepositoryCustom {
    fun findByBar(bar: String): List<Foo>;
}

FooRepositoryCustomImpl:

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

FooRepository:

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

}

【讨论】:

  • 感谢您的回答。这个解决方案确实有效,但是我自己实现的方法会丢失 JpaRepository 的上下文,这不是有意的。
【解决方案2】:

最佳实践:正如Heshan 所建议的,您可以将自定义接口添加到您的存储库接口。您的实现将被加载(带有“Impl”后缀的文件名),它将覆盖同名的默认方法。

扩展 JpaRepository: 为什么要扩展 JpaRepository 接口?如果你这样做,Spring 将尝试自己创建一个存储库实例。为防止这种情况发生,请使用@NoRepositoryBean 注释您的存储库interface

@NoRepositoryBean
public interface FooRepositoryCustom extends JpaRepository<Foo, Int> {
}

参考:我正在尝试使用 Spring Data Elasticsearch 做类似的事情 - 覆盖现有的存储库方法。我遵循了他们的文档,请参阅https://docs.spring.io/spring-data/elasticsearch/docs/4.1.15/reference/html/#repositories.custom-implementations

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多