Spring Boot自定义通用Repository遇QueryCreationException问题求助
Spring Data自定义通用Repository查询创建失败问题排查与解决
环境
- Spring Boot版本:3.2.2
错误信息
Caused by: org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract void com.example.repository.MakerCheckerRepository.merge(com.example.entity.MakerCheckerEntity); Reason: Failed to create query for method public abstract boolean com.example.repository.MakerCheckerRepository.merges(com.example.makerchecker.entity.MakerCheckerEntity); No property 'merge' found for type 'BankType'
相关代码
自定义Repository接口
import java.io.Serializable; @NoRepositoryBean public interface MakerCheckerRepository<E extends BaseEntity, ID extends Serializable> { boolean persist(E entity); boolean merge(E entity); }
自定义Repository实现类
import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import java.io.Serializable; public class MakerCheckerRepositoryImpl<E extends BaseEntity, ID extends Serializable> implements MakerCheckerRepository<E, ID> { @PersistenceContext EntityManager entityManager; @Override public void persist(E entity) { entityManager.persist(entity); } @Override public void merge(E entity) { entityManager.merge(entity); } }
业务Repository接口
@Repository public interface BankTypeRepository extends CrudRepository<BankType, Long>, JpaSpecificationExecutor<BankType>, BankTypeRepositoryCustom, MakerCheckerRepository<BankType, Long> { }
实体类
@Data @Entity @Table(name = "BANK_TYPE") public class BankType extends MakerCheckerEntity implements Serializable { ..... }
问题根源
- 方法签名不匹配:自定义接口
MakerCheckerRepository中persist和merge方法声明返回boolean,但实现类MakerCheckerRepositoryImpl中对应方法返回void。Spring Data无法找到匹配的实现方法时,会默认尝试将这些方法解析为基于实体属性的查询方法,而BankType实体不存在merge属性,因此抛出错误。 - 错误信息中提到的
merges方法(疑似笔误),进一步说明方法签名不一致导致Spring Data无法正确识别自定义实现。
解决方法
- 统一方法签名:将接口与实现类的方法返回值保持一致,二选一即可:
- 方案一:修改接口方法返回
void@NoRepositoryBean public interface MakerCheckerRepository<E extends BaseEntity, ID extends Serializable> { void persist(E entity); void merge(E entity); } - 方案二:修改实现类方法返回
boolean(按需添加业务逻辑)@Override public boolean persist(E entity) { try { entityManager.persist(entity); return true; } catch (Exception e) { // 此处添加异常处理逻辑 return false; } } @Override public boolean merge(E entity) { try { entityManager.merge(entity); return true; } catch (Exception e) { // 此处添加异常处理逻辑 return false; } }
- 方案一:修改接口方法返回
- 确保自定义实现被Spring识别:
- 给
MakerCheckerRepositoryImpl添加@Component或@Repository注解,或者确认其所在包在Spring的组件扫描范围内。当前实现类命名MakerCheckerRepositoryImpl符合Spring Data默认的[自定义接口名]Impl规则,无需额外配置。
- 给
内容的提问来源于stack exchange,提问作者kernel
相关产品推荐
相关产品推荐

