调用init方法失败; 嵌套exception是java.lang.IllegalArgumentException:对于方法public abstract的查询,validation失败
我正在开发Spring MVC + Spring-data-jpa + querydsl ,我是新手。 当我为querydsl编写代码时(在该代码工作正常之前),当我添加querydsl相关代码时,我开始收到以下错误,不知道出了什么问题。 请指导。
参考错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'visitRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List com.journaldev.spring.repository.VisitRepository.findByVisitType()! at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:753) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:668) at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:634) at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:682) at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:553) at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:494) at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) at javax.servlet.GenericServlet.init(GenericServlet.java:158) at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197) at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087) at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5262) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5550) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List com.journaldev.spring.repository.VisitRepository.findByVisitType()! at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:92) at org.springframework.data.jpa.repository.query.SimpleJpaQuery.(SimpleJpaQuery.java:62) at org.springframework.data.jpa.repository.query.JpaQueryFactory.fromMethodWithQueryString(JpaQueryFactory.java:72) at org.springframework.data.jpa.repository.query.JpaQueryFactory.fromQueryAnnotation(JpaQueryFactory.java:53)
Visit.java
@Entity @Table(name="VISIT") public class Visit { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Integer patientId; private String visitName; private String visitType; // setters and getters }
VisitRepository.java
@Repository public interface VisitRepository extends JpaRepository, QueryDslPredicateExecutor{ List findByVisitType(String visitType); @Query("SELECT v FROM VISIT v WHERE v.visitType='NEW'") List findByVisitType(); }
persistence.xml中:
com.journaldev.spring.model.Visit
的pom.xml
1.7 4.2.4.RELEASE 1.7.4 1.7.5 5.1.0.Final org.springframework spring-context ${org.springframework-version} org.springframework spring-webmvc ${org.springframework-version} org.springframework spring-tx ${org.springframework-version} org.hibernate hibernate-entitymanager ${hibernate.version} commons-dbcp commons-dbcp 1.4 org.springframework spring-orm ${org.springframework-version} org.springframework spring-test ${org.springframework-version} com.mysema.querydsl querydsl-core 3.3.2 com.mysema.querydsl querydsl-apt 3.3.2 com.mysema.querydsl querydsl-jpa 3.3.2 org.aspectj aspectjrt ${org.aspectj-version} org.slf4j slf4j-api ${org.slf4j-version} org.slf4j jcl-over-slf4j ${org.slf4j-version} runtime org.slf4j slf4j-log4j12 ${org.slf4j-version} runtime log4j log4j 1.2.17 runtime org.springframework.data spring-data-jpa 1.9.2.RELEASE javax.inject javax.inject 1 javax.servlet.jsp jsp-api 2.1 provided javax.servlet jstl 1.2 junit junit 4.12 test mysql mysql-connector-java 5.1.37 spring-mvc-jpa-hibernate org.apache.maven.plugins maven-compiler-plugin 2.5.1 ${java.version} ${java.version} -Xlint:all true true com.mysema.maven apt-maven-plugin 1.1.1 generate-sources process target/generated-sources com.mysema.query.apt.jpa.JPAAnnotationProcessor
图片供参考:
servlet的context.xml中
update org.hibernate.dialect.MySQL5Dialect <!-- true -->
好的,我得到了解决方案。 我不应该使用表名,它应该始终是模型/实体名称。 这(@Query(“SELECT v FROM Visit v WHERE v.visitType =’NEW’”))解决了问题。
@Repository public interface VisitRepository extends JpaRepository, QueryDslPredicateExecutor{ List findByVisitType(String visitType); @Query("SELECT v FROM Visit v WHERE v.visitType='NEW'") List findByVisitType(); }
我有一个非常相似的问题; 我的疑问是:
select fa from FlexAllowanceSnapshot s where s.employeeId=:employeeId
,应该是:
select fa from FlexAllowanceSnapshot fa where fa.employeeId=:employeeId
必须记住它不是SQL而是HQL,因此语法和规则略有不同。