Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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 带规格的弹簧护套总和(列)_Java_Spring_Specifications - Fatal编程技术网

Java 带规格的弹簧护套总和(列)

Java 带规格的弹簧护套总和(列),java,spring,specifications,Java,Spring,Specifications,我有一个实体,说: class MyEntity { Long id; String attr1; String attr2; String attr3; String attr4; Double attr5; } 我使用规范查询按属性过滤的结果,如: class MySpecification implements Specification<MyEntity> { private String attr1; pri

我有一个实体,说:

class MyEntity {
    Long id;
    String attr1;
    String attr2;
    String attr3;
    String attr4;
    Double attr5;
}
我使用
规范
查询按属性过滤的结果,如:

class MySpecification implements Specification<MyEntity> {
    private String attr1;
    private String attr2;
    private String attr3;
    private String attr4;

@Override
public Predicate toPredicate(Root<MyEntity> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
    List<Predicate> restriction = new ArrayList<>();
    if (!StringUtils.isEmpty(attr1)) {
        restriction.add(criteriaBuilder.equal(root.get("attr1"), attr1));
    }
    if (!StringUtils.isEmpty(attr2)) {
        restriction.add(criteriaBuilder.equal(root.get("attr2"), attr2));
    }
    // And so on
    Predicate predicate = criteriaBuilder.disjunction();
    predicate.getExpressions().add(criteriaBuilder.and(restriction.toArray(new Predicate[restriction.size()])));
    return predicate;
    }
}
类MySpecification实现了规范{
私有字符串attr1;
私有字符串属性2;
私有字符串属性3;
私有字符串属性4;
@凌驾
公共谓词toPredicate(根根、CriteriaQuery查询、CriteriaBuilder CriteriaBuilder){
列表限制=新建ArrayList();
如果(!StringUtils.isEmpty(attr1)){
add(criteriaBuilder.equal(root.get(“attr1”),attr1));
}
如果(!StringUtils.isEmpty(attr2)){
add(criteriaBuilder.equal(root.get(“attr2”),attr2));
}
//等等
谓词=criteriaBuilder.disconction();
predicate.getExpressions().add(criteriaBuilder.and(restriction.toArray)(新谓词[restriction.size()]);
返回谓词;
}
}
现在我想通过
规范
获得
attr5
的总和,我该怎么做


感谢您的高级指导。

经过研究,以下是解决方案:

创建一个接口:

interface MyRepositoryCustom {
    <S extends Number> S sum(Specification<MyEntity> spec, Class<S> resultType, String fieldName);
}
@Repository
class MyRepositoryCustomImpl implements MyRepositoryCustom {

    @Autowired
    private EntityManager entityManager;

    @Override
    public <S extends Number> S sum(Specification<MyEntity> spec, Class<S> resultType, String fieldName) {
        CriteriaBuilder builder = entityManager.getCriteriaBuilder();
        CriteriaQuery<S> query = builder.createQuery(resultType);
        Root<MyEntity> root = applySpecificationToCriteria(spec, query);
        query.select(builder.sum(root.get(fieldName).as(resultType)));
        TypedQuery<S> typedQuery = entityManager.createQuery(query);
        return typedQuery.getSingleResult();
    }

    protected <S> Root<MyEntity> applySpecificationToCriteria(Specification<MyEntity> spec, CriteriaQuery<S> query) {
        Root<MyEntity> root = query.from(MyEntity.class);
        if (spec == null) {
            return root;
        }
        CriteriaBuilder builder = entityManager.getCriteriaBuilder();
        Predicate predicate = spec.toPredicate(root, query, builder);
        if (predicate != null) {
            query.where(predicate);
        }
        return root;
    }
}
@Repository
interface MyEntityRepository extends JpaRepository<MyEntity, Long>, MyRepositoryCustom {

}