1 回答

TA貢獻1785條經驗 獲得超4個贊
這被稱為投影,Spring為您提供了兩種實現它的方法。
請記住,這在JPA術語中存在,而不僅僅是在春季。
以您的為出發點Repository
@Repository
public interface StudentDetailsRepository extends JpaRepository<StudentDetail, Integer> {
...
}
我們可以使用
interface-基于投影
只需創建一個界面,表示您想要的結果
public interface StudentDetailProjection {
String getFirstName();
String getMiddleName();
String getLastName();
}
并將方法添加到您的Repository
@Repository
public interface StudentDetailsRepository extends JpaRepository<StudentDetail, Integer> {
StudentDetailProjection get...(...);
}
Spring將自動子類化該接口,它將要求JPA執行一個查詢,該查詢將僅提取指定的字段。
class基于-基于的投影
的工作方式幾乎與基于接口的投影相同,但不需要代理和子類,因為您正在為Spring提供一個具體的類。
public class StudentDetailProjection {
private final String getFirstName;
private final String getMiddleName;
private final String getLastName;
public StudentDetailProjection(
final String getFirstName,
final String getMiddleName,
final String getLastName,
) {...}
// Getters
}
文檔更深入。
另外,必讀的是JPA大師弗拉德·米哈爾塞亞的這篇博客文章。
該方法可能看起來大致類似于
@Query("select new your.package.StudentDetailProjection(d.firstName, d.middleName, d.lastName) from StudentDetail d where month(d.dateOfBirth) = ?1")
List<StudentDetailProjection> getStudentListBasedOnDateOfBirth(final int month);
這將遵循具體選項 (2),因為需要構造函數。class
添加回答
舉報