QueryDSL + PathBuilder +强制转换为字符串

use*_*058 6 casting path dynamic querydsl

我正在使用动态过滤器过滤PrimeFaces DataTables org.springframework.data.jpa.domain.Specification.我使用Spring工作.现在我想知道如何使用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中做同样的事情?我可以使用PathBuilder new PathBuilder<T>(clazz, "entity")(你真的必须在这里使用变量吗?我希望我的类是通用的......)然后com.mysema.query.types.path.PathBuilder.get(String property)返回新的PathBuilder而不是Expression.

如果我尝试使用com.mysema.query.types.path.PathBuilder.getString(String property)我得到java.lang.IllegalArgumentException: Parameter value [1] did not match expected type [java.lang.Integer].

似乎我失踪的那部分是演员.我很确定有人正在处理同样的事情.

谢谢.

编辑:IllegalArgumentException的堆栈跟踪

尝试在整数列中搜索文本"1" com.mysema.query.types.path.PathBuilder.getString(String property)- 这就是我需要进行强制转换的地方:

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) ...

Tim*_*per 2

要获得有效的条件,您需要考虑属性的类型,例如

pathBuilder.getNumber(Integer.class, property).stringValue().like(likePattern)
Run Code Online (Sandbox Code Playgroud)

  • 抱歉,正在度假......我知道这一点,但是有什么方法可以动态地执行此操作吗?我的输入类似于“property”,但我不知道数据库中的该属性是什么类型,所以我不知道是否调用 `getNumber` 或 `getBoolean` 或 `getDate` 任何其他 getter... (6认同)