如何使用jpa查询嵌套对象

how to do query nested object using jpa

假设我有两个对象 Patient 及其具有 OneToMany 关系的 MedicalRecord。

class Patient {
    ...
    @OneToMany(mappedBy = "patient")
    List<MedicalRecord> mr;
    ...
}

class MedicalRecord {
    ...
    @ManyToOne
    Patient patient;

    Date createdAt;
    ...
}

现在我想在一个月内处理 MedicalRecord(s)。做这个的最好方式是什么?

我知道我可以将 JPQL 与 @NamedQuery 或 @Query 一起使用。但是我觉得没有我想象的那么好。我可以在不发出 JPQL 查询并留在对象域中的情况下执行此操作吗?例如,在 "Patient.mr" 字段上添加约束,以便仅检索一个月内的记录,我可以遍历它们而不用担心不必要的数据库提取?

谢谢!

您可以利用 Hibernate filters 来达到这个目的。

假设 table 中有 RECORD_DATE 列映射到 MedicalRecord,您可以为 mr 集合定义类似 RECORD_DATE >= SYSDATE - 30 的过滤器.

此枚举包括日期范围:

public enum DateType {

    PAST_DAY,

    PAST_WEEK,

    PAST_MONTH, 

    PAST_YEAR 
}

这个查询:

interface MedicalRecordRepository extends JpaRepository<MedicalRecord, Long> {
   @Query("select md from MedicalRecord md left join fetch md.patient pt   where md.createdAt >=:selectedDate")
   List<MedicalRecord> searchByDate(selectedDate);
}

实施Class:

     @Service
     class  MedicalRecordServiceImpl implements MedicalRecordService{

      public  List<MedicalRecord> searchByDate(DateType dateType){
            Date today = new Date();
            Calendar cal = new GregorianCalendar();
            cal.setTime(today);

            switch (dateType) {
            case PAST_DAY:
                cal.add(Calendar.DATE, -1);
                break;
            case PAST_WEEK:
                cal.add(Calendar.DAY_OF_WEEK, -1);
             break;
            case PAST_MONTH:
                cal.add(Calendar.DAY_OF_MONTH, -1);
                break;
            case PAST_YEAR:
                cal.add(Calendar.YEAR, -1);
                break;
            }
            List<MedicalRecord> result = repository.searchByDate(cal.getTime());
            return result;
       }
 }

Returns 结果基于您选择的日期。