2017-09-11 16 views
0

QueryDSL 4.1.4でサブクエリーを使用してクエリーを実行しようとしています。バージョン3.xの同等の機能は動作しましたが、バージョン4.1.4では動作しないようです。私が何かが欠落しているか、バグがあるかどうかはわかりません。すべての入力をいただければ幸いです! 、私は次の例外を取得し、上記でQueryDSLサブクエリーが機能していません - IllegalArgumentException:パラメーター値が予想されるタイプと一致しませんでした

PathBuilder productEntity = ...; 
PathBuilder categoryEntity = ...; 

JPQLQuery query = queryFactory.get().query(); 
query.distinct(); 

FilteredClause subQuery = JPAExpressions 
    .select(productEntity.get("id", Long.class)) 
    .from(categoryEntity) 
    .innerJoin(categoryEntity.get("products"), productEntity) 
    .where(categoryEntity.get("id", Long.class).eq(categoryId)); 

query.where(productEntity.get("id", Long.class).notIn(subQuery)); 
query.fetch(); 

:ここ

は、関連するコードです

java.lang.IllegalArgumentException: Parameter value [select product.id 
from Category category 
    inner join treat(category.products as Product) as product 
where category.id = ?1] did not match expected type [java.lang.Long (n/a)] 
    at org.hibernate.jpa.spi.BaseQueryImpl.validateBinding(BaseQueryImpl.java:897) 
    at org.hibernate.jpa.internal.QueryImpl.access$000(QueryImpl.java:61) 
    at org.hibernate.jpa.internal.QueryImpl$ParameterRegistrationImpl.bindValue(QueryImpl.java:235) 
    at org.hibernate.jpa.internal.QueryImpl$JpaPositionalParameterRegistrationImpl.bindValue(QueryImpl.java:371) 
    at org.hibernate.jpa.spi.BaseQueryImpl.setParameter(BaseQueryImpl.java:692) 
    at org.hibernate.jpa.spi.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:181) 
    at org.hibernate.jpa.spi.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:32) 
    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:483) 
    at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:372) 
    at com.sun.proxy.$Proxy365.setParameter(Unknown Source) 
    at com.querydsl.jpa.impl.JPAUtil.setConstants(JPAUtil.java:56) 
    at com.querydsl.jpa.impl.AbstractJPAQuery.createQuery(AbstractJPAQuery.java:102) 
    at com.querydsl.jpa.impl.AbstractJPAQuery.fetchCount(AbstractJPAQuery.java:81) 
... 

それは全体のサブクエリがパラメータとして設定されているように思えるし、Hibernateが幸せではありませんそれについて。この問題を回避するために使用する必要があるQueryDSL構文がありますか?

答えて

0

サブクエリのタイプがFilteredClauseであることがわかりました。コンパイルエラーは発生しませんでしたので、Querydslでよりうまく処理できるものかもしれませんが、サブクエリを下に変更すると、次のように動作します。

JPQLQuery subQuery = JPAExpressions 
    .select(productEntity.get("id", Long.class)) 
    .from(categoryEntity) 
    .innerJoin(categoryEntity.get("products"), productEntity); 

// Keep the .where() call separate to retain the JPQLQuery object 
subQuery.where(categoryEntity.get("id", Long.class).eq(categoryId)); 

// subQuery is now of type JPQLQuery instead of FilteredClause 
query.where(productEntity.get("id", Long.class).notIn(subQuery)); 

List result = query.fetch(); 
関連する問題