Kotlin中如何自定义实现JpaRepository方法,不使用方法名生成查询
你直接在Repository接口中编写Kotlin默认实现的写法不符合Spring Data JPA的自定义方法规则,Spring默认仍会将该方法识别为查询方法,优先尝试解析方法名生成SQL,不会直接使用你写的默认实现,因此会抛出找不到对应字段的错误。
方案1:仅需自定义查询语句(无复杂逻辑)
直接在方法上添加@Query注解指定你要执行的JPQL或原生SQL,Spring会直接使用你指定的语句,不再解析方法名生成查询:
@Repository interface TempRepository : JpaRepository<Temp, Int> { // JPQL写法:Temp为实体类名,xxxId为实体类对应的属性名 @Query("select t from Temp t where t.xxxId = :id") override fun findBySomethingId(id: Int): Optional<Temp> // 原生SQL写法:添加nativeQuery = true,语句直接写库表SQL // @Query(value = "select * from temp where 实际字段名 = :id", nativeQuery = true) // override fun findBySomethingId(id: Int): Optional<Temp> }
方案2:需要编写复杂自定义逻辑
采用Spring Data JPA官方推荐的自定义Repository实现类方案,完全由你控制方法逻辑,Spring不会做查询生成:
- 定义自定义接口,声明需要自定义的方法
interface TempRepositoryCustom { fun findBySomethingId(id: Int): Optional<Temp> }
- 编写接口实现类,类名默认遵循「原有Repository接口名+Impl」的规则(可通过配置修改后缀),可以自由注入需要的Bean实现任意逻辑
class TempRepositoryImpl( // 示例注入EntityManager,也可以注入JdbcTemplate、其他业务Bean等 private val entityManager: EntityManager ) : TempRepositoryCustom { override fun findBySomethingId(id: Int): Optional<Temp> { // 此处编写你的自定义逻辑,支持任意操作 val cb = entityManager.criteriaBuilder val query = cb.createQuery(Temp::class.java) val root = query.from(Temp::class.java) query.where(cb.equal(root.get<Int>("实际实体属性名"), id)) val result = entityManager.createQuery(query).resultList return result.firstOrNull()?.let { Optional.of(it) } ?: Optional.empty() } }
- 让原有Repository继承自定义接口即可
@Repository interface TempRepository : JpaRepository<Temp, Int>, TempRepositoryCustom
内容的提问来源于stack exchange,提问作者문대승
相关产品推荐
相关产品推荐

