调用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,因此语法和规则略有不同。