Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java QueryDSL和JPA2.1实体图_Java_Jpa_Spring Data_Spring Data Jpa_Querydsl - Fatal编程技术网

Java QueryDSL和JPA2.1实体图

Java QueryDSL和JPA2.1实体图,java,jpa,spring-data,spring-data-jpa,querydsl,Java,Jpa,Spring Data,Spring Data Jpa,Querydsl,在我的SpringData/JPA查询中,我需要添加带有许多条件的过滤,用户可以选择任何他想要的 有没有办法让QueryDSL和JPA2.1实体图一起工作?如果是这样的话,你能举个例子吗?这是我使用JPA标准API的项目中的一些代码。其主要思想是用户可以选择任何字段作为过滤器,在服务层中,所有过滤器都作为列表传递,其中字符串键在映射中是字段的名称,对象值是过滤器值。也许这会有帮助: public List<DocumentsShort> findAllByCriteria(Integ

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


有没有办法让QueryDSL和JPA2.1实体图一起工作?如果是这样的话,你能举个例子吗?

这是我使用JPA标准API的项目中的一些代码。其主要思想是用户可以选择任何字段作为过滤器,在服务层中,所有过滤器都作为
列表
传递,其中
字符串
键在映射中是字段的名称,
对象
值是过滤器值。也许这会有帮助:

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();
}
公共列表findAllByCriteria(整数firstResult、整数maxResult、字符串排序、字符串条件、列表条件){
CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaQuery CriteriaQuery=cb.createQuery(EntityClass.class);
Root=criteriaQuery.from(EntityClass.class);
Join AnotherEntityClassJoin=root.Join(“实体字段”,JoinType.LEFT);
谓词=cb.conjunction();
列表谓词列表=新的ArrayList();
用于(映射:条件){
谓词tempredicate=cb.conjunction();
tempPredicate=cb.and(predicate,cb.equal(root.get(“已删除”),0));//只有未标记为已删除的实体
对于(Map.Entry:Map.entrySet()){
String key=entry.getKey();
路径路径字段=空;
pathToField=root.get(key);
对象值=entry.getValue();
如果(值==null){
tempPredicate=cb.and(tempPredicate,cb.isNull(pathToField));
}else if(字符串的值实例){
tempPredicate=cb.and(tempPredicate,cb.like(pathToField,“%”+value+“%”);
}else if(列表的值实例){
tempPredicate=cb.and(tempPredicate,pathToField.in)((列表)值));
}否则{
tempPredicate=cb.and(tempPredicate,cb.equal(pathToField,value));
}
}
add(tempredicate);
}
where(cb.or(predicateList.toArray(新谓词[predicateList.size())));
TypedQuery=entityManager.createQuery(criteriaQuery);
query.setFirstResult(firstResult!=null?firstResult:0);
query.setMaxResults(maxResult!=null?maxResult:500);
返回query.getResultList();
}

也许JPA Criteria API而不是QueryDSL会很有帮助吗?另外,我发现QueryDSL支持JPA查询提示,实体图可能会在那里应用。。我还需要检查这个解决方案-QueryDSL中的JPA支持-