You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:50:36