Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.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
Hibernate 如何使用JPA和JpaSpecificationExecutor按结果分组?_Hibernate_Jpa 2.0_Spring Data_Spring Data Jpa - Fatal编程技术网

Hibernate 如何使用JPA和JpaSpecificationExecutor按结果分组?

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

我正在使用JpaSpecificationExecutor、JPA 2.0、Hibernate和MSSQL,并希望使用CriteriaBuilder构建以下查询:

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);