Java 如何使用Spring数据在Spring引导中从实体中选择几个字段?
我有一个用例,我想显示一个实体的内容,但隐藏某些字段。我的实体如下- 实体Java 如何使用Spring数据在Spring引导中从实体中选择几个字段?,java,spring,spring-boot,spring-mvc,spring-data-jpa,Java,Spring,Spring Boot,Spring Mvc,Spring Data Jpa,我有一个用例,我想显示一个实体的内容,但隐藏某些字段。我的实体如下- 实体 public class StudentDetail { @Id private Long ID; private String firstName; private String middleName; private String lastName; @JsonFormat(pattern="dd-MMM-yyyy", timezone="IST") @Temporal(TemporalType.DATE) pr
public class StudentDetail {
@Id
private Long ID;
private String firstName;
private String middleName;
private String lastName;
@JsonFormat(pattern="dd-MMM-yyyy", timezone="IST")
@Temporal(TemporalType.DATE)
private Date dateOfBirth;
}
它还有许多其他属性,我在这里没有展示
存储库-
@Repository
public interface StudentDetailsRepository extends JpaRepository<StudentDetail, Integer> {
@Query("select d from StudentDetail d where month(d.dateOfBirth) = ?1 ")
List<StudentDetail> getStudentListBasedOnDateOfBirth(int month);
}
但是,存储库
类的返回类型是实体类型StudentDetail。仅从中选择几个字段将导致错误。因此,我想知道我应该在repo
/服务
和controller
类中进行哪些更改(假设只有类的返回类型会更改) 这称为投影,Spring为您提供了两种实现方法。请记住,JPA术语中存在这种情况,而不仅仅是在春季 以您的
存储库
为起点
@Repository
public interface StudentDetailsRepository extends JpaRepository<StudentDetail, Integer> {
...
}
并将方法添加到您的存储库中
@Repository
public interface StudentDetailsRepository extends JpaRepository<StudentDetail, Integer> {
StudentDetailProjection get...(...);
}
更深入
此外,必须阅读的是JPA大师弗拉德·米哈尔恰(Vlad Mihalcea)的博客文章
该方法可能看起来像
@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);
@Query(“从StudentDetail d中选择新的.package.StudentDetailProjection(d.firstName,d.middleName,d.lastName),其中月份(d.dateOfBirth)=?1”)
列出getStudentListBasedOnDateOfBirth(最后一个整数月);
这将遵循具体的类
选项(2),因为需要构造函数。这称为投影,Spring为您提供了两种实现方法。请记住,JPA术语中存在这种情况,而不仅仅是在春季 以您的
存储库
为起点
@Repository
public interface StudentDetailsRepository extends JpaRepository<StudentDetail, Integer> {
...
}
并将方法添加到您的存储库中
@Repository
public interface StudentDetailsRepository extends JpaRepository<StudentDetail, Integer> {
StudentDetailProjection get...(...);
}
更深入
此外,必须阅读的是JPA大师弗拉德·米哈尔恰(Vlad Mihalcea)的博客文章
该方法可能看起来像
@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);
@Query(“从StudentDetail d中选择新的.package.StudentDetailProjection(d.firstName,d.middleName,d.lastName),其中月份(d.dateOfBirth)=?1”)
列出getStudentListBasedOnDateOfBirth(最后一个整数月);
这将遵循具体的
类
选项(2),因为需要构造函数。所以接口只包含我想要在输出JSON中的那些getter?另外,请解释一下存储库代码的更改。这个方法应该包含什么?@BoudhayanDev文档中已经解释了所有内容,包括示例、解释等等。阅读它,并尝试一些东西。@JBNizet我还是添加了这个例子。实现这一点有多种方法,Boudhayan Dev可以阅读Vlad Mihalcea博客文章中的所有详细信息。@BoudhayanDev我更新了答案。看看底部。这就是所谓的构造函数表达式。不过,看看我链接的博客帖子。@BoudhayanDev绝对不是。查询注释中的“新”部分只是告诉JPA它必须实例化将这些值传递给构造函数的类。投影不是一个实体,所以接口只包含我想要在输出JSON中的那些getter?另外,请解释一下存储库代码的更改。这个方法应该包含什么?@BoudhayanDev文档中已经解释了所有内容,包括示例、解释等等。阅读它,并尝试一些东西。@JBNizet我还是添加了这个例子。实现这一点有多种方法,Boudhayan Dev可以阅读Vlad Mihalcea博客文章中的所有详细信息。@BoudhayanDev我更新了答案。看看底部。这就是所谓的构造函数表达式。不过,看看我链接的博客帖子。@BoudhayanDev绝对不是。查询注释中的“新”部分只是告诉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);