메서드 public abstract java.util에 대한 쿼리의 유효성을 검사하지 못했습니다.목록.
저는 기본적인 SpringBoot 앱을 가지고 있습니다.Spring Initializer, JPA, 내장 Tomcat, Thymeleaf 템플릿 엔진 및 패키지를 실행 가능한 JAR 파일로 사용합니다.SpringBoot의 버전은 2.0.1입니다.풀어주다.이 메서드를 사용하여 CrudRepository에서 확장되는 클래스 리포지토리를 만들었습니다.
@Query("select us.priceAlertsTapas.tapa from User us left join us.priceAlertsTapas pat left join pat.tapa tapa where pat.priceAlert = ?1")
List<Tapa> tapasByUserPriceAlert (PriceAlert pa);
그러나 프로젝트를 시작할 때 다음 오류가 발생했습니다.
Validation failed for query for method public abstract java.util.List
at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:93)
at org.springframework.data.jpa.repository.query.SimpleJpaQuery.<init>(SimpleJpaQuery.java:63)
at org.springframework.data.jpa.repository.query.JpaQueryFactory.fromMethodWithQueryString(JpaQueryFactory.java:76)
at org.springframework.data.jpa.repository.query.JpaQueryFactory.fromQueryAnnotation(JpaQueryFactory.java:56)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$DeclaredQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:139)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:206)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:79)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.lookupQuery(RepositoryFactorySupport.java:553)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.lambda$mapMethodsToQuery$1(RepositoryFactorySupport.java:546)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.Iterator.forEachRemaining(Iterator.java:116)
at java.util.Collections$UnmodifiableCollection$1.forEachRemaining(Collections.java:1049)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.mapMethodsToQuery(RepositoryFactorySupport.java:548)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.lambda$new$0(RepositoryFactorySupport.java:538)
at java.util.Optional.map(Optional.java:215)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:538)
at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:317)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.lambda$afterPropertiesSet$3(RepositoryFactoryBeanSupport.java:287)
at org.springframework.data.util.Lazy.getNullable(Lazy.java:141)
at org.springframework.data.util.Lazy.get(Lazy.java:63)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:290)
at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:102)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1761)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1698)
... 47 common frames omitted
Caused by: java.lang.NullPointerException: null
at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:424)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.joinElement(HqlSqlBaseWalker.java:3931)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3717)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3595)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:720)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:576)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:313)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:261)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:266)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:189)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:141)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:115)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:153)
at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:553)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:662)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:350)
at com.sun.proxy.$Proxy105.createQuery(Unknown Source)
at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:87)
... 76 common frames omitted
제안된 솔루션에서도 동일한 오류가 발생했습니다.
이 쿼리에서도 같은 오류가 발생합니다(!?).)
@Query("select us.priceAlertsTapas.tapa from User us ")
여기서 사용자 개체:
@Entity
@Table(name="t_user")
public class User implements Serializable, UserDetails {
...
@ManyToMany
@JoinTable(
name="t_user_price_alert_tapa",
joinColumns=@JoinColumn(name="user_id", referencedColumnName="id"),
inverseJoinColumns=@JoinColumn(name="price_alert_tapa_id", referencedColumnName="id"))
private Set<PriceAlertTapa> priceAlertsTapas = new HashSet<>();
}
그리고.
@Entity
@Table(name="t_price_alert")
public class PriceAlert implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
public PriceAlert(int id) {
super();
this.id = id;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
...
}
그리고.
@Entity
@Table(name="t_price_alert_tapa")
public class PriceAlertTapa implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
public PriceAlertTapa(PriceAlert priceAlert, Tapa tapa) {
super();
this.tapa = tapa;
this.priceAlert = priceAlert;
}
private Tapa tapa;
private PriceAlert priceAlert;
..
}
테이블 이름을 사용할 때 이 오류가 발생했습니다.@Query()
하지만 당신은 클래스 이름을 사용해야 합니다.@Query()
:
올바르지 않음:
@Transactional
@Modifying
@Query("from SHIPPING_DOC e where e.fulfillmentId in ?1")
List<ShippingDocumentsJsonEntity> deleteByFulfillmentIdIn(List<String> fulfillmentIds);
정답:
@Transactional
@Modifying
@Query("from ShippingDocumentsJsonEntity e where e.fulfillmentId in ?1")
List<ShippingDocumentsJsonEntity> deleteByFulfillmentIdIn(List<String> fulfillmentIds);
priceAlertsTapas가 설정되어 있기 때문에 점 경로를 사용할 수 없습니다.
@Query("select us.priceAlertsTapas.tapa from User us")
우선 당신은 그것에 가입해야 합니다.
@Query("select pat.tapa from User us join us.priceAlertsTapas pat")
가장 오른쪽 엔티티에만 관심이 있다면 왼쪽(외부) 조인을 사용할 이유가 없습니다. 이것이 쿼리의 유효성 검사에 실패하는 이유인지는 잘 모르겠습니다.
저는 이것을 시도할 것입니다.
@Query("select tapa fom PriceAlertsTapas pat join pat.tapa tapa where pat.priceAlert = ?1")
List<Tapa> tapasByUserPriceAlert (PriceAlert pa);
지정된 "tapa"가 "가격 경고"(예: 사용자당 하나)와 여러 번 연결될 수 있는 경우 반품에서 여러 번 찾을 수 있습니다.List
솔루션은 반환 유형을 다음으로 변경하는 것입니다.Set<Tapa>
또는 사용할"select distinct...."
당신의 질문에.
반면에 PriceAlertsTapas가 단순한 다대다 연결이라면 @ManyToManyJPA 주석을 @JoinTable과 함께 사용하는 것이 더 나을 수 있습니다.예를 들어, 여기를 보세요.
다음 항목을 잘못 선택했기 때문에 이 예외가 있습니다.
us
이라User
us.priceAlertsTapas
이라Set
그 후에 당신은 얻으려고 노력합니다.tapa
그것부터가 아니라도Set
그런 분야는 없습니다.
쿼리 문자열에서 테이블 이름 대신 클래스 이름을 사용하고 열 이름 대신 필드 이름을 사용해야 합니다.그러나 nativeQuery=true 속성을 사용하는 경우 쿼리 문자열에 테이블 및 열 이름을 사용해야 합니다.
언급URL : https://stackoverflow.com/questions/49817396/validation-failed-for-query-for-method-public-abstract-java-util-list
'it-source' 카테고리의 다른 글
sql server 그룹에서 첫 번째 행 선택 (0) | 2023.06.25 |
---|---|
속성 선언의 "new" 키워드(c#) (0) | 2023.06.25 |
SQL 서버 저장 프로시저를 버전 제어하는 가장 좋은 방법은 무엇입니까? (0) | 2023.06.25 |
npm 피어 종속성을 자동으로 설치하는 방법은 무엇입니까? (0) | 2023.06.25 |
오라클 호출 저장 프로시저 내부 선택 (0) | 2023.06.25 |