1 回答

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超4個(gè)贊
這被稱(chēng)為投影,Spring為您提供了兩種實(shí)現(xiàn)它的方法。
請(qǐng)記住,這在JPA術(shù)語(yǔ)中存在,而不僅僅是在春季。
以您的為出發(fā)點(diǎn)Repository
@Repository
public interface StudentDetailsRepository extends JpaRepository<StudentDetail, Integer> {
...
}
我們可以使用
interface-基于投影
只需創(chuàng)建一個(gè)界面,表示您想要的結(jié)果
public interface StudentDetailProjection {
String getFirstName();
String getMiddleName();
String getLastName();
}
并將方法添加到您的Repository
@Repository
public interface StudentDetailsRepository extends JpaRepository<StudentDetail, Integer> {
StudentDetailProjection get...(...);
}
Spring將自動(dòng)子類(lèi)化該接口,它將要求JPA執(zhí)行一個(gè)查詢(xún),該查詢(xún)將僅提取指定的字段。
class基于-基于的投影
的工作方式幾乎與基于接口的投影相同,但不需要代理和子類(lèi),因?yàn)槟跒镾pring提供一個(gè)具體的類(lèi)。
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大師弗拉德·米哈爾塞亞的這篇博客文章。
該方法可能看起來(lái)大致類(lèi)似于
@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);
這將遵循具體選項(xiàng) (2),因?yàn)樾枰獦?gòu)造函數(shù)。class
添加回答
舉報(bào)