用QuerydslPredicateExecutor分组的子句

时间:2019-08-26 12:40:16

标签: java spring-data-jpa querydsl

我的实体如下:

@Entity
public class Enterprise{
  private String sid = UUID.randomUUID().toString();
  private String name;
  private String organisationSid;
  private EnterpriseStatus status;
  @CreatedDate
  private Date dateCreated;
}

存储库:

public interface EnterpriseRepository extends 
            PagingAndSortingRepository<Enterprise, String>, 
            QuerydslPredicateExecutor<Enterprise>{}

问题: 我想获取基于dateCreated的记录的每日/每月/每年计数。我可以在此处将QueryDSL用于该组吗? 它可以让我创建如下的groupBy子句:

GroupBy.groupBy(QEnterprise.enterprise.dateCreated.month());

我不确定现在如何使用此GroupByBuilder来查询存储库。存储库具有findAll方法,该方法采用com.querydsl.core.types.Predicates,但没有方法采用com.querydsl.core.group.GroupByBuilder

2 个答案:

答案 0 :(得分:1)

您无法在默认实现中传递GroupBy子句。为了获得所需的输出,首先,必须实现自定义存储库,其次,必须编写自己的方法和逻辑。

第一步:


编写一个新的存储库界面:

import org.springframework.data.repository.NoRepositoryBean;
import com.querydsl.core.types.Predicate;
import java.util.Map;

@NoRepositoryBean
public interface EnterpriseRepositoryCustom {
    Map<Integer, Long> countByMonth(Predicate predicate);
}

现在将此接口继承到您现有的EnterpriseRepository

public interface EnterpriseRepository extends 
            PagingAndSortingRepository<Enterprise, String>, 
            QuerydslPredicateExecutor<Enterprise>,
            EnterpriseRepositoryCustom{}

然后创建自定义存储库的新实现类:

import com.querydsl.core.group.GroupBy;
import com.querydsl.core.types.Predicate;
import org.springframework.data.jpa.repository.support.QueryDslRepositorySupport;
import org.springframework.stereotype.Repository;
import java.util.Map;

@Repository
public class EnterpriseRepositoryImpl extends QueryDslRepositorySupport 
             implements EnterpriseRepositoryCustom {
    public EnterpriseRepositoryImpl() {
        super(Enterprise.class);
    }

    @Override
    public Map<Integer, Long> countByMonth(Predicate predicate) {
        //Have to write logic here....
    }
}

第二步:


使用countByMonth方法编写逻辑,如下所示:

public Map<Integer, Long> countByMonth(Predicate predicate) {
        Map<Integer, Long> countByMonth = getQuerydsl()
                .createQuery()
                .from(QEnterprise.enterprise)
                .where(predicate)
                .transform(GroupBy
                      .groupBy(QEnterprise.enterprise.dateCreated.month())
                      .as(QEnterprise.enterprise.count()));
       return countByMonth;
    }

可选: 如果要按月获取记录列表,则只需将计数修改为-

        Map<Integer, List<Enterprise>> recordByMonth = getQuerydsl()
                .createQuery()
                .from(QEnterprise.enterprise)
                .where(predicate)
                .transform(GroupBy
                      .groupBy(QEnterprise.enterprise.dateCreated.month())
                      .as(GroupBy.list(QEnterprise.enterprise)));

我希望你找到了答案!

示例github project

答案 1 :(得分:0)

可以试试这个方法

return new JPAQuery<>(entityManager).where(predicate).groupBy(QWarehouseItemHistory.warehouseItemHistory.warehouse).fetchCount();