如何用JPA Repository方法名替代@Query注解的JPQL查询?
问题
我有两个实体类:
data class MetaConfigEo( @Id val id: String? = null, val config: Config, ) data class ConfigEo( @Id val id: String? = null, val config: Config, @Enumerated(EnumType.STRING) var configType: ConfigType, @OneToOne @JoinColumn(name = "meta_config_id") var metaConfig: MetaConfigEo? = null, )
同时我有如下Jpa Repository:
@Repository interface MetaConfigRepository : JpaRepository<MetaConfigEo, String> { @Query( "SELECT mc FROM meta_config mc JOIN config c ON mc.id = c.metaConfig.id " + "WHERE c.configType = :configType" ) fun findMetaConfigByConfigType(configType: ConfigType): MetaConfigEo? }
请问是否可以将该JPA仓库中的上述方法,替换为通过方法名自动生成查询的形式,而非使用@Query注解指定JPQL语句?
回答
可以替换,利用Spring Data JPA的方法名查询规则就能实现,无需手动编写JPQL。
具体实现
因为ConfigEo与MetaConfigEo是一对一关联(ConfigEo持有MetaConfigEo的引用),Spring Data JPA会自动解析方法名中的关联属性,生成对应的JOIN查询。你可以将原方法替换为以下任意一种写法:
写法1:驼峰式关联属性
@Repository interface MetaConfigRepository : JpaRepository<MetaConfigEo, String> { fun findByConfigEoConfigType(configType: ConfigType): MetaConfigEo? }
写法2:下划线分隔关联层级(更清晰)
@Repository interface MetaConfigRepository : JpaRepository<MetaConfigEo, String> { fun findByConfigEo_ConfigType(configType: ConfigType): MetaConfigEo? }
效果说明
这两种方法名生成的查询逻辑和你原有的@Query注解完全一致:
- 自动JOIN
ConfigEo表(通过meta_config_id关联MetaConfigEo) - 根据传入的
configType过滤数据 - 返回匹配的
MetaConfigEo实例
内容的提问来源于stack exchange,提问作者midi
相关产品推荐
相关产品推荐

