Hibernate 如何使用JPA和JpaSpecificationExecutor按结果分组?
我正在使用JpaSpecificationExecutor、JPA 2.0、Hibernate和MSSQL,并希望使用CriteriaBuilder构建以下查询:Hibernate 如何使用JPA和JpaSpecificationExecutor按结果分组?,hibernate,jpa-2.0,spring-data,spring-data-jpa,Hibernate,Jpa 2.0,Spring Data,Spring Data Jpa,我正在使用JpaSpecificationExecutor、JPA 2.0、Hibernate和MSSQL,并希望使用CriteriaBuilder构建以下查询: SELECT CURR_DATE, MAX(POSITION) FROM TOP_COMPONENT_HISTORY GROUP BY CURR_DATE 我的问题:可能吗?如果,如何 谢谢你对这件事的关注 这是我的密码 表(顶部组件历史记录) 服务 public Page<TopComponentHistory> fi
SELECT CURR_DATE, MAX(POSITION) FROM TOP_COMPONENT_HISTORY GROUP BY CURR_DATE
我的问题:可能吗?如果,如何
谢谢你对这件事的关注
这是我的密码
表(顶部组件历史记录)
服务
public Page<TopComponentHistory> findByCurrDate(ArticleSearchForm searchForm){
return topComponentHistoryRepository.findAll(TopComponentHistory.findAllGroupBy(),constructPageSpecification(searchForm.getPageNum());
}
公共页面findByCurrDate(ArticleSearchForm searchForm){
返回topComponentHistoryRepository.findAll(TopComponentHistory.findAllGroupBy(),constructPageSpecification(searchForm.getPageNum());
}
领域
public class TopComponentHistory implements Serializable {
public static Specification<TopComponentHistory> findAllGroupBy() {
How can i make query...
return ..
}
}
公共类TopComponentHistory实现可序列化{
公共静态规范findAllGroupBy(){
我怎样才能查询。。。
返回。。
}
}
存储库
public interface TopComponentHistoryRepository extends JpaRepository<TopComponentHistory, String>, JpaSpecificationExecutor<TopComponentHistory> {
}
公共接口TopComponentHistoryRepository扩展了JpaRepository,JpaSpecificationExecutor{
}
公共静态规范findAllGroupBy(){
返回新规范(){
@凌驾
公共谓词toPredicate(根根、CriteriaQuery查询、CriteriaBuilder cb){
query.groupBy(列名称);
}
}
我使用了一个带有一些自定义规范的泛型类,它有点脏,但可以工作。
它适用于根实体中的列名,如果需要按其他列分组,则有必要修改代码,但此代码可以作为起点
public class GenericSpecifications<T> {
public Specification<T> groupBy(Specification<T> specification, List<String> columnNames) {
return new Specification<T>() {
@Override
public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
List<Expression<?>> columnNamesExpression = columnNames.stream().map(x -> root.get(x))
.collect(Collectors.toList());
query.groupBy(columnNamesExpression);
return specification.toPredicate(root, query, criteriaBuilder);
}
};
}
公共类泛型规范{
公共规范分组依据(规范规范、列表列名称){
返回新规范(){
@凌驾
公共谓词toPredicate(根根、CriteriaQuery查询、CriteriaBuilder CriteriaBuilder){
列表我很难集中精力处理您的初始查询。它缺少一个FROM
子句,我不确定您希望如何处理TITLE
?更新的查询无效。它解决了FROM
问题,但您仍然无法选择不在GROUP BY
子句中的原始列。您能描述一下吗您真正想要实现的是什么?我想使用JPA和JpaSpecificationExecutor按结果分组。一个更好的解释是JpaSpecificationExecutor有方法列表findAll(规范规范规范);我们可以在其中将规范作为参数。可以通过重写toPredicate(根、CriteriaQuery、CriteriaBuilder)来创建规范方法。我们可以创建任意数量的谓词,并对groupBy子句使用query.groupBy()。我花了一些时间才找到在groupBy中定义列名的正确方法。因此,在Deepak示例中,替换query.groupBy(column_name);BY query.groupBy(root.get(TopComponentHistory_u.YOUR_column));返回语句在哪里?返回新规范
public static Specification<TopComponentHistory> findAllGroupBy() {
return new Specification<TopComponentHistory>(){
@Override
public Predicate toPredicate(Root<TopComponentHistory> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
query.groupBy(column_name);
}
}
public class GenericSpecifications<T> {
public Specification<T> groupBy(Specification<T> specification, List<String> columnNames) {
return new Specification<T>() {
@Override
public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
List<Expression<?>> columnNamesExpression = columnNames.stream().map(x -> root.get(x))
.collect(Collectors.toList());
query.groupBy(columnNamesExpression);
return specification.toPredicate(root, query, criteriaBuilder);
}
};
}
GenericSpecifications<YourEntity> genericSpecifications = new GenericSpecifications<YourEntity>();
..
Specification<YourEntity> specification = Specification.where(null);
..
specification = genericSpecifications.groupBy(specification, names);
YourEntityRepository.findAll(specification);