querydsl instanceof导致hibernate错误查询Type(1) [英] querydsl instanceof results in wrong query for hibernate Type(1)
问题描述
如果我使用Hibernate Inheritance实体,我可以很容易地总是尝试只加载我需要的子类。
SELECT p FROM产品p WHERE TYPE(p)=?1
试图用queryDSL实现相同的查询: p>
QProduct.product.instanceOfAny(clazz)
但我得到以下异常:
引起:java.lang.IllegalArgumentException:参数值[Product]与预期类型不匹配[java.lang.Integer(n / a)]
查询querydsl产生的是
pre $ SELECT count(product)
FROM Product product
WHERE product.class =? 1 //这应该是TYPE(产品)=?1
我的身份
@Entity
@Table(name =product)
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Product {
...
完整堆栈跟踪(对于类似的情况,但不同的类名):
原因:java .lang.IllegalArgumentException:参数值[BasketDiscount]不匹配预期类型[java.lang.Integer中(N / A)]在org.hibernate.jpa.spi.BaseQueryImpl.validateBinding
(BaseQueryImpl.java:874)
在org.hibernate.jpa.internal.QueryImpl.access $ 000(QueryImpl.java:80)$ b $在org.hibernate.jpa.internal.QueryImpl $ ParameterRegistrationImpl.bindValue(QueryImpl.java:248)$ b b $ b at org.hibernate.jpa.internal.QueryImpl $ JpaPositionalParameterRegistrationImpl.bindValue(QueryImpl.java:337)
at org.hibernate.jpa.spi.BaseQueryImpl.setParameter(BaseQueryImpl.java:674)
。在在org.hibernate.jpa.spi.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:49)
org.hibernate.jpa.spi.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:198)
。在COM。 my.mase.query.jpa.impl.JPAUtil.setConstants(JPAUtil.java:55)
at com.mysema.query .jpa.impl.AbstractJPAQuery.createQuery(AbstractJPAQuery.java:128)
在com.mysema.query.jpa.impl.AbstractJPAQuery.count(AbstractJPAQuery.java:79)
在org.springframework.data .jpa.repository.support.QueryDslJpaRepository.findAll(QueryDslJpaRepository.java:125)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework .data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:442)
at org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:427)
在org.springframework.data.repository.core.support.RepositoryFact orySupport $ QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:381)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.transaction.interceptor.TransactionInterceptor $ 1 .proceedWithInvocation(TransactionInterceptor.java:98)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor .java:95)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136 )
... 94 more
问题在querydsl git中被讨论和解决集线器存储库,
和 @Timo提及修正将使用3.6.2版本
它应该在3.6.2中可用
p>
If I use Hibernate Inheritance entities I could easily always try to load only the subclass I need like this
SELECT p FROM Product p WHERE TYPE(p) = ?1
trying to achieve the same query with queryDSL:
QProduct.product.instanceOfAny(clazz)
But I get the following exception
Caused by: java.lang.IllegalArgumentException: Parameter value [Product] did not match expected type [java.lang.Integer (n/a)]
query that querydsl produces is
SELECT count(product)
FROM Product product
WHERE product.class = ?1 // this should be TYPE(product) = ?1
my enitity
@Entity
@Table(name = "product")
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Product {
...
Full Stack Trace (for a similar case but different Class name):
Caused by: java.lang.IllegalArgumentException: Parameter value [BasketDiscount] did not match expected type [java.lang.Integer (n/a)]
at org.hibernate.jpa.spi.BaseQueryImpl.validateBinding(BaseQueryImpl.java:874)
at org.hibernate.jpa.internal.QueryImpl.access$000(QueryImpl.java:80)
at org.hibernate.jpa.internal.QueryImpl$ParameterRegistrationImpl.bindValue(QueryImpl.java:248)
at org.hibernate.jpa.internal.QueryImpl$JpaPositionalParameterRegistrationImpl.bindValue(QueryImpl.java:337)
at org.hibernate.jpa.spi.BaseQueryImpl.setParameter(BaseQueryImpl.java:674)
at org.hibernate.jpa.spi.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:198)
at org.hibernate.jpa.spi.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:49)
at com.mysema.query.jpa.impl.JPAUtil.setConstants(JPAUtil.java:55)
at com.mysema.query.jpa.impl.AbstractJPAQuery.createQuery(AbstractJPAQuery.java:128)
at com.mysema.query.jpa.impl.AbstractJPAQuery.count(AbstractJPAQuery.java:79)
at org.springframework.data.jpa.repository.support.QueryDslJpaRepository.findAll(QueryDslJpaRepository.java:125)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:442)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:427)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:381)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
... 94 more
This issue was discussed and solved in querydsl github repository,
and as @Timo mentions the fix will be using the version 3.6.2
It should be available in 3.6.2
这篇关于querydsl instanceof导致hibernate错误查询Type(1)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!