2015-03-30 9 views
4

Я фильтрую данные PrimeFaces DataTables с помощью динамических фильтров. У меня это работает с использованием Spring org.springframework.data.jpa.domain.Specification. Теперь я не понимаю, как сделать то же самое с помощью QueryDSL.QueryDSL + PathBuilder + cast to string

Используя спецификацию, я могу использовать javax.persistence.criteria.Root, чтобы получить javax.persistence.criteria.Join, используйте javax.persistence.criteria.Expression.as(Class<String> type), чтобы передать его в строку и, наконец, использовать 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].

Кажется, что часть, которую мне не хватает, - это актерский состав. Я уверен, что кто-то уже имел дело с тем же.

Спасибо.

Edit: Стек трассировки для 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) ...

+0

Не могли бы вы предоставить полный стек? –

+0

@ user1622058 Удалось ли вам в этом разобраться? –

+0

В конце концов я создал DTO и собрал Predicate вручную, используя stringValue() ... не лучший способ, но не нашел лучшего ... – user1622058

ответ

1

Чтобы получить действительное условие, вам нужно будет учитывать типы свойств, например

pathBuilder.getNumber(Integer.class, property).stringValue().like(likePattern) 
+3

Извините, был в отпуске ... Я знаю об этом, но есть ли способ сделать это динамически? Мой ввод - это что-то вроде «свойства», но я не знаю, какой тип это свойство в базе данных, поэтому я не знаю, следует ли вызывать 'getNumber' или' getBoolean' или 'getDate' любой другой getter .... – user1622058