【发布时间】:2020-09-16 22:54:33
【问题描述】:
我正在尝试创建一些动态机制,以使用基于给定类、规范、选择列、聚合列和按列分组的条件查询从数据库中获取数据。
这是运行良好的代码:
public <T> List<T> findDataByConfiguration(Specification<T> specification,
Class clazz, List<String> selectColumns,
List<String> aggregationColumns, List<String> groupByColumns) {
CriteriaBuilder criteriaBuilder = this.entityManager.getCriteriaBuilder();
CriteriaQuery<Tuple> query = criteriaBuilder.createTupleQuery();
Root<T> root = query.from(clazz);
List<Selection<?>> multiSelectColumns = new ArrayList<>();
for (String s : selectColumns) {
multiSelectColumns.add(root.get(s).alias(s));
}
for (String s : aggregationColumns) {
multiSelectColumns.add(criteriaBuilder.sum(root.get(s)).alias(s));
}
List<Expression<?>> groupByColumnsList = new ArrayList<>();
for (String s : groupByColumns) {
groupByColumnsList.add(root.get(s));
}
query.groupBy(groupByColumnsList);
query.multiselect(multiSelectColumns);
query.where(specification.toPredicate(root, query, criteriaBuilder));
List<Tuple> resultList = this.entityManager.createQuery(query).getResultList();
// resultList processing
}
当我想获取平面实体类的数据时,此代码工作正常。 但是,当我尝试在选择/聚合/组中添加子实体字段时,它会引发错误:
java.lang.IllegalArgumentException:无法在此 ManagedType [com.sup.as.data.entity.co.Annual] 上找到具有给定名称 [child.id] 的属性
// annotations
public class Annual {
private Long id;
private String fp;
private ID iDetails;
// getter-setter
}
public class ID {
private Long id;
private BigDecimal amount;
// getter-setter
public String giveMeData() {
if(id != null && amount != null) {
return "FILED";
} else {
return "NOT FILED";
}
}
}
现在假设我想要字段 Annual.id、Annual.fp、SUM(Annual.iDetails.amount)、Annual.iDetails.giveMeData
那么是否可以在 select/aggregate/group by 中添加子实体列? 如果有人做过这种类型的解决方案,那么请帮我解决这个问题。
【问题讨论】:
标签: java spring-data-jpa aggregate-functions hibernate-criteria