[如何使用本地查询时获取Page 像Spring Data Jpa中的东西

问题描述 投票:0回答:1

我陷入了困境。我有一个查询,如下所示

@Query(value="SELECT bha.activity_code_id, ac.activity_code_full_name, pt.plan_name " + 
        " FROM bp_bid_history_activity bha, activity_code ac, plan_template pt where rownum < 201", nativeQuery = true)
List<Object[]> getContractReceivedAddedActivityCodes(@Param("bidId")Long bidId, @Param("historyId")Long historyId, Pageable pageable);

// Trying to achieve this
@Query(value="SELECT bha.activity_code_id, ac.activity_code_full_name, pt.plan_name " + 
        " FROM bp_bid_history_activity bha, activity_code ac, plan_template pt where rownum < 201", nativeQuery = true)
Page<Object[]> getContractReceivedAddedActivityCodesPageable(@Param("bidId")Long bidId, @Param("historyId")Long historyId, Pageable pageable);

实际上是为了查看结果,我将查询限制为200个结果。因为实际查询未返回结果。在实际查询中,有适当的where子句。但是无论如何。

这是我的使用方式

//@Test
public void getContractReceivedAddedActivityCodes() {

    Long bidId = 178820L;
    Long historyId = 783520L;

    Pageable pageable = PageRequest.of(0, 10, Sort.by("activity_code_id"));

    List<Object[]> addedActivitiesList  = bpBidActivityRepository.getContractReceivedAddedActivityCodes(bidId, historyId, pageable);
    List<ContractReceivedActivityCodesModel> addedActivityCodes =  getContractReceivedActivityCodesModel(addedActivitiesList);
    printList(addedActivityCodes);

}

private List<ContractReceivedActivityCodesModel> getContractReceivedActivityCodesModel(List<Object[]> activitiesList) {

    List<ContractReceivedActivityCodesModel> activityCodes = null;
    if (CollectionUtils.isNotEmpty(activitiesList)) {
        activityCodes = activitiesList.stream()
                .map(ContractReceivedActivityCodesModel::new).collect(Collectors.toList()); 
    }
    return activityCodes;
}

public class ContractReceivedActivityCodesModel {
    private Long activeCodeId;
    private String activityCodeFullName;
    private String planName;

    public ContractReceivedActivityCodesModel(Object[] object) {
        if (ArrayUtils.isNotEmpty(object)) {
            BigDecimal activeCodeId = (BigDecimal) object[0];
            if (activeCodeId != null) {
                this.activeCodeId = activeCodeId.longValue();
            }

            this.activityCodeFullName = (String) object[1];
            this.planName = (String) object[2];
        }
    }
}

该查询将返回200个结果。现在的问题是,当List<Object[]>查询运行时,我只得到10个结果。因为我要传递10页大小。但我也想获取总记录大小。因此,我可以在UI上显示分页,该分页显示200条记录中的10条,显示200条记录中的30条。

[当我们使用Page<Person>Page<T>返回类型时,我们还将获得总数。在这种情况下,如何获得总数。或者我想得到类似Page<Object[]>的东西。我尝试了Page<List<Object[]>>Page<Object[]>之类的操作,但出现错误。

谢谢

hibernate spring-data-jpa jpa-2.1
1个回答
0
投票

您必须提供countQuery

@Query(value="SELECT bha.activity_code_id, ac.activity_code_full_name, pt.plan_name " + 
        " FROM bp_bid_history_activity bha, activity_code ac, plan_template pt where rownum < 201", 
countQuery="SELECT count(*) " + 
        " FROM bp_bid_history_activity bha, activity_code ac, plan_template pt where rownum < 201"
nativeQuery = true)
Page<Object[]> getContractReceivedAddedActivityCodesPageable(@Param("bidId")Long bidId, @Param("historyId")Long historyId, Pageable pageable);
© www.soinside.com 2019 - 2024. All rights reserved.