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类型

hibernate 实现多表连接查询 查询结果映射到自定义类中

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);
}