it-source

메서드 public abstract java.util에 대한 쿼리의 유효성을 검사하지 못했습니다.목록.

criticalcode 2023. 6. 25. 20:11
반응형

메서드 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

반응형