2016-03-16 3 views
2

В моем запросе на данные Spring/JPA мне нужно добавить фильтрацию со многими критериями, и пользователь может выбрать все, что захочет.QueryDSL и JPA 2.1 График сущности

Есть ли способ совместной работы QueryDSL и JPA 2.1 График сущности? Если да, не могли бы вы показать пример?

+0

Может быть, API JPA Criteria вместо QueryDSL будет полезен? – D0dger

+0

Кроме того, я нашел информацию о том, что QueryDSL поддерживает подсказки для запросов JPA, и там может быть применен график Entity Graph .. Мне также нужно проверить это решение - http://stackoverflow.com/questions/21405897/fetch-plan-aka-fetch -group-aka-entity-graph-in-querydsl – alexanoid

+0

Поддержка JPA в QueryDSL - http://www.querydsl.com/static/querydsl/latest/reference/html/ch02.html#jpa_integration – D0dger

ответ

1

Это код моего проекта с использованием 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(); 
} 
Смежные вопросы