web-dev-qa-db-ja.com

メソッドpublic abstract Java.util.Listのクエリの検証に失敗しました

基本的なSpringBootアプリがあります。 Spring Initializer、JPA、組み込みTomcat、Thymeleafテンプレートエンジン、およびパッケージを実行可能JARファイルとして使用します。 SpringBootのバージョンは2.0.1.RELEASEです。このメソッドで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",
        [email protected](name="user_id", referencedColumnName="id"),
        [email protected](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;
..
}
7
en Peris

PriceAlertsTapasが設定されているため、ドットパスを使用できません。

@Query("select us.priceAlertsTapas.tapa from User us")

まずあなたはそれに参加する必要があります

@Query("select pat.tapa from User us join us.priceAlertsTapas pat")
4

右端のエンティティのみに関心がある場合は、左(外部)結合を使用する理由はありませんが、これがクエリの検証が失敗した理由かどうかはわかりません。

私はこれを試します:

@Query("select tapa fom PriceAlertsTapas pat join pat.tapa tapa where pat.priceAlert = ?1")
List<Tapa> tapasByUserPriceAlert (PriceAlert pa);

特定の「タパ」が「価格アラート」に複数の関連付けを持つことができる場合(たとえば、ユーザーごとに1つ)、リターンListでそれが複数回見つかります。解決策は、戻り値の型をSet<Tapa>に変更するか、クエリで"select distinct...."を使用することです。

一方、PriceAlertsTapasが単純な多対多の関連付けである場合は、@ ManyToMany JPAアノテーションを使用し、最終的には@JoinTableを使用することをお勧めします。たとえば here を参照してください。

1
IonD

@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);
0
avinash kumar

間違った選択をしているため、この例外があります:

usUser

us.priceAlertsTapasSetです

その後、あなたはそれからtapaを取得するつもりですが、Setにはそのようなフィールドがありません。

0