我的实体如下:
@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
答案 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)));
我希望你找到了答案!
答案 1 :(得分:0)
可以试试这个方法
return new JPAQuery<>(entityManager).where(predicate).groupBy(QWarehouseItemHistory.warehouseItemHistory.warehouse).fetchCount();