querydsl instanceof导致hibernate错误查询Type(1) [英] querydsl instanceof results in wrong query for hibernate Type(1)

查看:281
本文介绍了querydsl instanceof导致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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆