SpringDataJPA 自定义联合查询、Group by查询

1.分页自定义联合查询 - NativeQuery

/**
* 接收类,需要和查询的字段保持一致
*/
@Data
@Schema(title = "审批表、审批协同分页查询信息")
@AllArgsConstructor
@NoArgsConstructor
public class ApprovalPageRspVO implements Serializable {
    private static final long serialVersionUID = 1L;

    @Schema(description = "审批id")
    private BigInteger id;

    @Schema(description = "开发类型(1-应用开发 2-算法开发 3-数据开发)")
    private Integer devType;

    @Schema(description = "开发任务id")
    private BigInteger projectId;

    @Schema(description = "开发任务名称")
    private String projectName;

    @Schema(description = "审批任务状态(0-待审批 1-已撤回 2-成功 3-失败;approvalTaskStatus 传入时有返回)")
    private Integer approvalTaskStatus;

    @Schema(description = "审批任务进度")
    private String approvalTaskProcess;

    @Schema(description = "审批状态(0-待审批 1-已同意 2-已拒绝;approvalStatus 传入时有返回)")
    private Integer approvalClbStatus;
}

Service 实现类

import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
	
@Service
public class ApprovalServiceImpl implements ApprovalService {

	@Autowired
	private EntityManager entityManager;
	
	public Page<ApprovalPageRspVO> pageList(GetApprovalPageVO pageVO) {
		Pageable pageable = PageRequest.of(pageVO.getPageNumber(), pageVO.getPageSize());
        StringBuilder sb = new StringBuilder();
        StringBuilder condition = new StringBuilder();
        if (null != pageVO.getDevType()) {
            condition.append(" and approval.dev_type = " + pageVO.getDevType());
        }
        if (!StringUtils.isEmpty(pageVO.getProjectName())) {
            condition.append(" and project.name like '%" + pageVO.getProjectName() + "%'");
        }

        if(pageVO.getApprovalRole() == 1){
        	// 假名需要和接收类字段名保持一致          
            sb.append("select approval.id as id, approval.dev_type as \"devType\", approval.project_id as \"projectId\", project.name as \"projectName\", approval.approval_task_status as \"approvalTaskStatus\", null as \"approvalTaskProcess\", null as \"approvalClbStatus\" " +
                    " from approval left join project on approval.project_id = project.id " +
                    " where 1=1 ");
            condition.append(" and approval.create_id = '" + principal.getUserId() + "'");
            if(null != pageVO.getApprovalTaskStatus()){
                condition.append(" and approval.approval_task_status = " + pageVO.getApprovalTaskStatus());
            }
        }

        if(pageVO.getApprovalRole() == 2){
            sb.append("select approval.id as id, approval.dev_type as \"devType\", approval.project_id as \"projectId\", project.name as \"projectName\", null as \"approvalTaskStatus\", null as \"approvalTaskProcess\", approvalClb.approval_status as \"approvalClbStatus\" " +
                    " from approval_collaboration approvalClb " +
                    " right join approval on approvalClb.approval_id = approval.id " +
                    " left join project on project.id = approval.project_id " +
                    " where 1=1 ");
            condition.append(" and approvalClb.owner_id = '" + principal.getUserId() + "'");
            if(null != pageVO.getApprovalStatus()){
                condition.append(" and approvalClb.approval_status = " + pageVO.getApprovalStatus());
            }
        }

        sb.append(condition).append(" order by approval.create_time desc");
		Query query = entityManager.createNativeQuery(sb.toString());
		query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(ApprovalPageRspVO.class));
		int total = query.getResultList().size();
		query.setFirstResult(pageVO.getPageNumber() * pageVO.getPageSize());
		query.setMaxResults((pageVO.getPageNumber() + 1) * pageVO.getPageSize());
		List<ApprovalPageRspVO> approvalPageRspVOList = query.getResultList();
		Page<ApprovalPageRspVO> page = new PageImpl<>(approvalPageRspVOList, pageable, total);
		return page;
	}
}

2.分页自定义联合查询 - 非NativeQuery

/**
* 接收对象,需要和查询的字段保持一致
*/
@Data
@Builder
public class DeploymentDetailVO implements Serializable {

    private static final long serialVersionUID = 1L;

    @Schema(description = "部署id")
    private Long id;

    @Schema(description = "部署时间")
    private Date createTime;

    @Schema(description = "部署状态")
    private Integer status;

    @Schema(description = "代码仓库分支")
    private String repoBranch;

    @Schema(description = "代码仓库tag")
    private String repoTag;

    @Schema(description = "服务名")
    private String serviceName;

    @Schema(description = "镜像名")
    private String imageName;

	// 需要自行实现全参构造函数
    public DeploymentDetailVO(Long id, Date createTime, Integer status, String repoBranch, String repoTag, String serviceName, String imageName) {
        this.id = id;
        this.createTime = createTime;
        this.status = status;
        this.repoBranch = repoBranch;
        this.repoTag = repoTag;
        this.serviceName = serviceName;
        this.imageName = imageName;
    }
}

Repository 类

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

    @Query("select new com.zhmap.mcloud.devops.application_dev.vo.DeploymentDetailVO(dep.id, dep.createTime, dep.status, build.repoBranch, build.repoTag, p.serviceName, build.imageName) " +
            "from Deployment dep left join Build build on dep.buildId = build.id left join Project p on build.projectId = p.id where dep.projectId = :projectId and build.env = :env")
    Page<DeploymentDetailVO> getDeploymentPage(@Param("projectId") long projectId, @Param("env") int env, Pageable pageable);

3.分页Group by查询 - NativeQuery

@Data
@Schema(title = "分页查询产品")
@Builder
public class ProductPageVO implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;

    @Schema(description = "创建人")
    private String createId;

    @Schema(description = "创建时间")
    private Date createTime;

    @Schema(description = "更新人")
    private String updateId;

    @Schema(description = "更新时间")
    private Date updateTime;

    @Schema(description = "产品名称")
    private String name;

    @Schema(description = "产品图标路径")
    private String icon;

    @Schema(description = "产品描述")
    private String desc;

    @Schema(description = "产品下项目个数统计")
    private long projCount;

	// ProductPageVO 类需要自行实现全参构造函数,保证查询出来的字段和该类的属性保持一致
    public ProductPageVO(Long id, String createId, Date createTime, String updateId, Date updateTime, String name, String icon, String desc, long projCount) {
        this.id = id;
        this.createId = createId;
        this.createTime = createTime;
        this.updateId = updateId;
        this.updateTime = updateTime;
        this.name = name;
        this.icon = icon;
        this.desc = desc;
        this.projCount = projCount;
    }
}

Repository 类

	@Query("SELECT new com.zhmap.mcloud.devops.application_dev.vo.ProductPageVO(prod.id, prod.createId, prod.createTime, prod.updateId, prod.updateTime, prod.name, prod.icon, prod.desc, count(proj.id)) " +
	            " from Product as prod left JOIN Project proj on prod.id = proj.productId WHERE prod.name like CONCAT('%',:name,'%') GROUP BY prod.id")
    Page<ProductPageVO> getProductPage(@Param("name") String name, Pageable pageable);
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
回答: 在JPA中,可以使用自定义group by语句来进行分组查询。引用\[1\]中的代码示例展示了一个使用JPA的@Query注解进行自定义group by查询的例子。该查询语句使用了sum函数和group by子句,将OrderformDetail表按照goods字段进行分组,并计算每组的num字段的总和。返回的结果是一个List,其中每个元素是一个包含num和goods字段的对象。 引用\[2\]展示了一个用于接收查询结果的类ApprovalPageRspVO,该类的字段需要和查询的字段保持一致。 引用\[3\]中的代码展示了如何将查询结果转换为List<OrderGoods>的示例。在这个示例中,首先创建一个空的List<OrderGoods>,然后遍历查询结果_list中的每一行数据。对于每一行数据,将其转换为一个Object数组cells,然后根据数组的索引将对应的值设置到OrderGoods对象中,并将OrderGoods对象添加到list中。最后返回这个list作为查询结果。 总结来说,JPA自定义group by查询可以通过使用@Query注解和自定义查询语句来实现,查询结果可以通过定义一个与查询字段对应的类来接收,并通过遍历查询结果进行转换。 #### 引用[.reference_title] - *1* *3* [【JPASpringBoot JPA 使用GroupBy 进行分组查询](https://blog.csdn.net/mudarn/article/details/94437978)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [SpringDataJPA 自定义联合查询Group by查询](https://blog.csdn.net/who__care/article/details/131195839)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七里香的秋刀鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值