当前位置: 首页 > 知识库问答 >
问题:

QueryDSL子查询不工作-IllegalArgumentException:参数值与预期类型不匹配

公孙锋
2023-03-14

我试图在QueryDSL4.1.4中运行带有子查询的查询。版本3.x中的等价物起作用了,但我似乎无法在版本4.1.4中使其起作用。不确定是我漏了什么还是有个bug。感谢任何输入!

下面是相关代码:

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语法来避免此问题?

共有1个答案

潘修为
2023-03-14

我发现问题是子查询的类型为filteredcluse。它没有导致任何编译错误,所以它可能是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();
 类似资料:
  • 它打印出值的等效,这是因为这一行: 通过调用表示。 那么,如何使Hibernate相信是的实例? 我的枚举是由加载的。而由URLClassLoader加载,由另一个类加载器加载。

  • 我试图更新一个实体与OneToOne关系使用restful Web服务。 我使用自定义查询,但它不工作 错误: java.lang.的参数值[2]不匹配预期的类型[com.mezoo.tdc.model.ActivityType(n/a)] 活动豆 豆子 它是可能的更新没有自定义查询?我想使用下面的POST请求: {"uuid":"9d9fa946-ee6e-408e-9e8a-7a9786a1d

  • 当我想跑的时候: 我得到: 执行操作“MappingAddAction”的服务异常,java.lang.IllegalArgumentException:参数值[5118]与预期的类型[com.vernuso.trust.server.domain.ClientImport.MappingInfo(N/A)]不匹配 有人能帮助我理解为什么它需要类型而不是类型吗? 我有两个表,如下图所示。Mappi

  • 我做错了什么? 正在更新: 我发现了问题所在。问题与ActionRepository中找到的函数有关。函数的签名首先要求两个日期进行比较,然后id和我给出了相反的值。我很清楚,在我上了它之后,我会有一个问题的日期,所以答案确实帮助了我。谢谢大家!

  • 我得到的错误. 我对此感到困惑,因为它来自下面显示的被注释掉的服务方法。当我把它注释掉时,错误就避免了。列是一个,即或。 实体: 我的存储库: 我的服务: 当我取消注释时

  • 这是我运行程序时收到的错误: 注:[19533]是我使用的一个测试值。 这是在CustomerServiceBeanImpl.java中出现错误的方法: 在快速检查ERD时,“Customer”表中的“id”列的数据类型为bigint。然而,我不确定这是否重要。(顺便提一下PostgreSQL数据库。) 如何修复此错误?