在項目中使用jpa進行多表連接查詢,基本上返回的都是多張表中的數據。那麼問題來了,這關聯返回的數據那麼多,還是不同表當中的數據,數據庫中也沒有表和它對應啊,怎麼處理呢?返回Object嗎?
其實可以用新建Vo的方法解決,話不多說,直接看代碼示例:
示例實體類如下:
1.教師類
public class Teacher implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "teacher_name")
private String teacherName;
@Column(name = "teacher_id_card")
private String teacherIdCard;
@Enumerated(EnumType.STRING)
@Column(name = "sex")
private Sex sex;
@Enumerated(EnumType.STRING)
@Column(name = "teacher_status")
private TeacherStatus teacherStatus;
@Enumerated(EnumType.STRING)
@Column(name = "highest_degree")
private HighestDegree highestDegree;
@Enumerated(EnumType.STRING)
@Column(name = "specialized_technical_job")
private SpecializedTechnicalJob specializedTechnicalJob;
// getter setter 構造 tostring省略了,自己加哈........
}
2.學校類
public class School implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "school_name")
private String schoolName;
@NotNull
@Column(name = "school_principal", nullable = false)
private String schoolPrincipal;
// getter setter 構造 tostring省略了,自己加哈........
}
接收多表關聯返回結集,新建Vo類:該類中放你返回的數據,需要什麼放什麼(我這裏放的是school和teacher兩張表的定義)
public class SchoolTeacherVo {
private String teacherIdCard;
private String teacherName;
private Sex sex;
private HighestDegree highestDegree;
private SpecializedTechnicalJob specializedTechnicalJob;
private TeacherStatus teacherStatus;
private String schoolName;
// getter setter 構造 tostring省略了,自己加哈........
}
接口中方法:返回你定義的Vo泛型的list就行
@Query(value = "SELECT new com.mycompany.myapp.vo.SchoolTeacherVo( b.teacherIdCard,b.teacherName,b.sex,b.highestDegree,b.specializedTechnicalJob,b.teacherStatus,c.schoolName) FROM ScheduleTeacher a inner JOIN Teacher b on a.teacher.id=b.id LEFT JOIN School c on b.school.id=c.id WHERE a.schedule.id= :scheduleId")
List<SchoolTeacherVo>getTeachers(@Param("scheduleId") Long scheduleId);
注意:寫sql時@Query(value = "SELECT new com.mycompany.myapp.vo.XXXVo( a.xxx,b.xxx)FROM XXX a inner JOIN YYY b on a.id=b.xxid WHERE XXXX= :XXX")
再次強調 new 絕對不能少,後面最好跟全限定類名(不寫有可能找不到這個類),還有new com.mycompany.myapp.vo.XXXVo( )括號裏面寫你查得東西,注意這裏面返回數據順序要和你實體類中構造方法參數順序一致,否則會出錯。
運行結果如下: