QueryDSL 和 JPA 2.1 实体图

QueryDSL and JPA 2.1 Entity Graph

在我的 Spring Data/JPA 查询中,我需要添加具有许多条件的过滤,用户可以选择任何他想要的。

有没有办法让 QueryDSL 和 JPA 2.1 实体图协同工作?如果是这样,你能举个例子吗?

这是我使用 JPA Criteria API 的项目中的一些代码。主要思想是用户可以选择任何字段作为过滤器,并且在服务层中所有过滤器都作为 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();
}