Это код моего проекта с использованием API-критериев JPA. Основная идея, что пользователь может выбрать любое поле в качестве фильтра и на уровне обслуживания, все фильтры передаются как List<Map<String, Object>>
, где String
ключ на карте - это имя поля, а значение Object
- значение фильтра. Возможно, это будет полезно:
public List<DocumentsShort> findAllByCriteria(Integer firstResult, Integer maxResult, String sort, String condition, List<Map<String, Object>> conditions) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<EntityClass> criteriaQuery = cb.createQuery(EntityClass.class);
Root<EntityClass> root = criteriaQuery.from(EntityClass.class);
Join<EntityClass, AnotherEntityClass> AnotherEntityClassJoin = root.join("fieldOfEntity", JoinType.LEFT);
Predicate predicate = cb.conjunction();
List<Predicate> predicateList = new ArrayList<>();
for (Map<String, Object> map : conditions) {
Predicate tempPredicate = cb.conjunction();
tempPredicate = cb.and(predicate, cb.equal(root.get("deleted"), 0)); // only entities not marked as deleted
for (Map.Entry<String, Object> entry : map.entrySet()) {
String key = entry.getKey();
Path pathToField = null;
pathToField = root.get(key);
Object value = entry.getValue();
if (value == null) {
tempPredicate = cb.and(tempPredicate, cb.isNull(pathToField));
} else if (value instanceof String) {
tempPredicate = cb.and(tempPredicate, cb.like(pathToField, "%" + value + "%"));
} else if (value instanceof List) {
tempPredicate = cb.and(tempPredicate, pathToField.in(((List) value)));
} else {
tempPredicate = cb.and(tempPredicate, cb.equal(pathToField, value));
}
}
predicateList.add(tempPredicate);
}
criteriaQuery.where(cb.or(predicateList.toArray(new Predicate[predicateList.size()])));
TypedQuery query = entityManager.createQuery(criteriaQuery);
query.setFirstResult(firstResult != null ? firstResult : 0);
query.setMaxResults(maxResult != null ? maxResult : 500);
return query.getResultList();
}
Может быть, API JPA Criteria вместо QueryDSL будет полезен? – D0dger
Кроме того, я нашел информацию о том, что QueryDSL поддерживает подсказки для запросов JPA, и там может быть применен график Entity Graph .. Мне также нужно проверить это решение - http://stackoverflow.com/questions/21405897/fetch-plan-aka-fetch -group-aka-entity-graph-in-querydsl – alexanoid
Поддержка JPA в QueryDSL - http://www.querydsl.com/static/querydsl/latest/reference/html/ch02.html#jpa_integration – D0dger