含@SqlResultSetMapping的JPA实体类仓库方法创建失败问题排查
问题:带参数的findTestLikeNo方法创建失败原因分析
我创建了Entity实体类与Repository仓库接口,但创建带有参数?1的findTestLikeNo方法时失败,报错信息如下,求问题原因。
实体类代码
import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; import java.util.Date; @SqlResultSetMapping( name="testMap", entities = { @EntityResult( entityClass= TestEntity.class, fields = { @FieldResult(name="testNo", column="test_no"), @FieldResult(name="testItem", column="test_item"), } ) } ) @NamedNativeQueries({ @NamedNativeQuery( name = "TestEntity.findTest", query = "w1.test_no, w1.test_item" + " from W_table w1", resultSetMapping = "testMap", resultClass = TestEntity.class ), @NamedNativeQuery( name = "TestEntity.findTestLikeNo", query = "w1.test_no, w1.test_item" + " from W_table w1" + " where w1.test_no like ?1;", resultSetMapping = "testMap", resultClass = TestEntity.class ) }) @Entity @Getter @Setter public class TestEntity { public TestEntity(){ } @Id private String testNo; private String testItem; }
Repository接口代码
import hoge.mypkg.TestEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.List; @Repository public interface TestRepository extends JpaRepository<TestEntity, String> { List<TestEntity> findTest(); List<TestEntity> findTestLikeNo(String testNo); }
报错信息
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testRepository' defined in TestRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Could not create query for public abstract java.util.List TestRepository.findTestLikeNo(java.lang.String); Reason: Failed to create query for method public abstract java.util.List TestRepository.findTestLikeNo(java.lang.String); No property 'findTestLikeNo' found for type 'TestEntity'
问题原因及解决方案
核心原因
Spring Data JPA处理Repository方法时,默认优先通过方法名解析规则生成查询语句,而非直接匹配你定义的@NamedNativeQuery。你的方法名findTestLikeNo不符合Spring Data JPA的命名规范(标准格式如findBy[属性名]Like),框架会尝试从TestEntity中查找名为findTestLikeNo的属性,显然不存在这个属性,因此抛出报错。
另外,你定义的原生SQL还存在语法错误:所有查询语句都遗漏了select关键字,即使Repository创建成功,后续执行SQL时也会报错。
解决方案
方案1:显式指定使用命名查询
在Repository的findTestLikeNo方法上添加@Query注解,明确告诉框架使用你定义的命名原生查询:
import org.springframework.data.jpa.repository.Query; @Repository public interface TestRepository extends JpaRepository<TestEntity, String> { List<TestEntity> findTest(); @Query(nativeQuery = true, name = "TestEntity.findTestLikeNo") List<TestEntity> findTestLikeNo(String testNo); }
方案2:遵循Spring Data JPA方法命名规则
如果不需要复杂的原生SQL,可以直接修改方法名符合命名规范,框架会自动生成LIKE查询,无需手动编写原生查询:
@Repository public interface TestRepository extends JpaRepository<TestEntity, String> { List<TestEntity> findTest(); // 框架会自动生成匹配testNo属性的LIKE查询 List<TestEntity> findByTestNoLike(String testNo); }
必须修正的SQL语法错误
无论采用哪种方案,都需要修正@NamedNativeQuery中的SQL语句,添加select关键字:
// 修正后的findTest查询 query = "select w1.test_no, w1.test_item from W_table w1" // 修正后的findTestLikeNo查询 query = "select w1.test_no, w1.test_item from W_table w1 where w1.test_no like ?1;"
内容的提问来源于stack exchange,提问作者11ohina017
相关产品推荐
相关产品推荐

