Spring Boot本地运行线上正常项目遇UnsatisfiedDependencyException问题
嘿,我来帮你搞定这个Spring Boot启动异常!从你贴的代码和日志来看,问题根源很明确——你的EventCategoryRepository里的自定义JPQL查询语句验证失败了,导致整个Bean创建链出了问题。
先给你理清楚问题所在,再给你解决方案:
问题拆解
首先看最关键的异常信息:
java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.Optional com.demo.eventsetup.eventcategory.repository.EventCategoryRepository.findByNameIgnoreCase(java.lang.String)!
结合你的代码细节,问题出在这两个点:
JPQL属性名与实体映射不匹配
你的EventCategory实体用了@Where(clause = "ec_deactivated IS NULL"),这里的ec_deactivated是数据库的列名;但在Repository的JPQL里,你写的是eventCategory.deactivated IS NULL。如果你的EventCategory或者它继承的LocationDomainObject里没有deactivated这个属性,或者这个属性没有正确映射到ec_deactivated列,JPA就会找不到这个字段,直接报错。重复的过滤条件
其实你已经通过@Where注解给EventCategory加了全局过滤,所有查询都会自动排除ec_deactivated不为空的记录,所以JPQL里再写AND eventCategory.deactivated IS NULL完全是多余的,反而可能引发解析问题。
具体修复方案
你可以选下面任意一种方式来解决:
方案一:简化JPQL(推荐)
既然@Where已经帮你自动过滤了已注销的分类,直接删掉冗余的条件就行:
public interface EventCategoryRepository extends PagingAndSortingRepository<EventCategory, UUID> { @Query( "FROM EventCategory eventCategory WHERE UPPER( eventCategory.name ) = UPPER( :name )" ) Optional<EventCategory> findByNameIgnoreCase( @Param( "name" ) String name ); }
方案二:修正实体属性映射
如果你确实需要手动控制这个过滤条件(比如某些场景要查已注销的记录),那得确保实体类里有对应的属性:
在LocationDomainObject或者EventCategory类里添加:
@Column(name = "ec_deactivated") private LocalDateTime deactivated; // 别忘了加getter和setter方法
这样JPQL里的eventCategory.deactivated就能正确映射到数据库的ec_deactivated列了。
额外检查项
最后再帮你确认几个容易踩坑的点:
- 你的启动类
EventSetupApplication在com.demo.eventsetup包下,从包结构(
)来看,Spring Boot能自动扫描到子包下的Repository和实体类,这部分没问题。 - 确认本地数据库的
eventsetupschema存在,event_category表的结构和实体类的映射完全一致,比如列名、类型都要对应上。
按照上面的方法改完,重启应用应该就能正常启动啦!
内容的提问来源于stack exchange,提问作者AKA

