hibernate 实现多表连接查询 查询结果映射到自定义类中
1、查询的实体类
package com.yzyxtech.project.tianfutalents.core.entity.headhunter; import com.yzyxtech.project.tianfutalents.common.entity.IdentityEntity; import com.yzyxtech.project.tianfutalents.core.entity.enums.ProjectTalentsStatus; import com.yzyxtech.project.tianfutalents.core.entity.talents.Talents; import io.swagger.annotations.ApiModelProperty; import lombok.*; import javax.persistence.*; /** * 加入项目的人才 * * @author gyw * @version 2018/11/24 */ @Getter @Setter @ToString @Entity public class ProjectTalents extends IdentityEntity { @ManyToOne private Project project; @ManyToOne private Talents talents; @Enumerated(EnumType.STRING) private ProjectTalentsStatus status; }
2、映射的自定义类
package com.yzyxtech.project.tianfutalents.core.dto.headhunter; import com.yzyxtech.project.tianfutalents.core.entity.enums.ProjectTalentsStatus; import lombok.*; import javax.persistence.EnumType; import javax.persistence.Enumerated; /** * @Description: 项目、状态分组数量 * @Author: gyw * @CreateDate: 2018/12/13 15:27 */ @Getter @Setter @ToString @AllArgsConstructor//全局构造器--查询ProjectTalents类的这些数据(必须有要查询封装字段的构造器) @NoArgsConstructor public class ProjectGroupStatusDTO{ private Long projectId; private Long count;//数量 private ProjectTalentsStatus status; }
3、repository(new com.yzyxtech.project.tianfutalents.core.dto.headhunter.ProjectGroupStatusDTO(project.id,count(project.id),status) )new自定义类,必须要加上地址不然会找不到,参数类型必须跟构造器一致,count(project.id)返回long类型
package com.yzyxtech.project.tianfutalents.core.repository.headhunter; import com.yzyxtech.project.tianfutalents.core.dto.headhunter.ProjectGroupStatusDTO; import com.yzyxtech.project.tianfutalents.core.entity.enums.ProjectTalentsStatus; import com.yzyxtech.project.tianfutalents.core.entity.headhunter.ProjectTalents; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import java.util.List; import java.util.Optional; /** * @author gyw * @version 2018/11/24 */ public interface ProjectTalentsRepository extends JpaRepository<ProjectTalents, Long>, JpaSpecificationExecutor<ProjectTalents> { @Query(value = "select new com.yzyxtech.project.tianfutalents.core.dto.headhunter.ProjectGroupStatusDTO(project.id,count(project.id),status)" + " from ProjectTalents where 1 = 1 and project.id in (?1) and deleted = 0 " + "and enabled = 1 group by project.id,status") List<ProjectGroupStatusDTO> findStatusTotalByProjectIdsAndStatus(Long[] ids); }