【发布时间】:2015-03-30 13:28:13
【问题描述】:
我正在使用动态过滤器过滤 PrimeFaces 数据表。我使用 Spring org.springframework.data.jpa.domain.Specification 进行了这项工作。现在我想知道如何使用 QueryDSL 来做同样的事情。
使用规范,我可以使用javax.persistence.criteria.Root 获得javax.persistence.criteria.Join,使用javax.persistence.criteria.Expression.as(Class<String> type) 将其转换为String,最后使用javax.persistence.criteria.CriteriaBuilder.like(Expression<String> x, String pattern, char escapeChar)。
如何在 QueryDSL 中做同样的事情?我可以使用 new PathBuilder<T>(clazz, "entity") 获取 PathBuilder(你真的必须在这里使用变量吗?我希望我的类是通用的......)但是 com.mysema.query.types.path.PathBuilder.get(String property) 返回新的 PathBuilder 而不是表达式。
如果我尝试使用com.mysema.query.types.path.PathBuilder.getString(String property),我会得到java.lang.IllegalArgumentException: Parameter value [1] did not match expected type [java.lang.Integer]。
似乎我缺少的部分是演员表。 我很确定有人已经在处理同样的事情了。
谢谢。
编辑:IllegalArgumentException 的堆栈跟踪
尝试使用 com.mysema.query.types.path.PathBuilder.getString(String property) 在整数列中搜索文本“1” - 这就是我需要进行强制转换的地方:
Caused by: java.lang.IllegalArgumentException: Parameter value [1] did not match expected type [java.lang.Integer]
at org.hibernate.ejb.AbstractQueryImpl.validateParameterBinding(AbstractQueryImpl.java:375)
at org.hibernate.ejb.AbstractQueryImpl.registerParameterBinding(AbstractQueryImpl.java:348)
at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:375)
at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:442)
at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:72)
at com.mysema.query.jpa.impl.JPAUtil.setConstants(JPAUtil.java:44)
at com.mysema.query.jpa.impl.AbstractJPAQuery.createQuery(AbstractJPAQuery.java:130)
at com.mysema.query.jpa.impl.AbstractJPAQuery.createQuery(AbstractJPAQuery.java:97)
at com.mysema.query.jpa.impl.AbstractJPAQuery.list(AbstractJPAQuery.java:240)
at org.springframework.data.jpa.repository.support.QueryDslJpaRepository.findAll(QueryDslJpaRepository.java:102)
...
【问题讨论】:
-
你能提供完整的堆栈跟踪吗?
-
@user1622058 你最后解决了吗?
-
最后我创建了一个 DTO 并使用 stringValue() 手动组装谓词...不是最好的方法,但还没有找到更好的方法...
-
@user1622058:我有同样的问题。你能发布你的解决方案吗?
标签: dynamic casting path querydsl