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
添加回答
举报