如何使用jpa查询嵌套对象

时间:2015-12-22 13:24:58

标签: hibernate jpa nested

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

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

class MedicalRecord {
    ...
    @ManyToOne
    Patient patient;

    Date createdAt;
    ...
}

现在我想在一个月内使用MedicalRecord。做这个的最好方式是什么?

我知道我可以使用带有@NamedQuery或@Query的JPQL来实现。但我觉得它并不像我预期的那么好。我可以不发出JPQL查询并保留在对象域中吗?例如,在&#34; Patient.mr&#34;上添加约束。字段,以便只检索一个月内的记录,我可以遍历它们,而不必担心不必要的数据库提取?

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以将Hibernate filters用于此目的。

假设表中有RECORD_DATE列,MedicalRecord已映射到该列,您可以为RECORD_DATE >= SYSDATE - 30集合定义mr之类的过滤器。

答案 1 :(得分:2)

此枚举包含日期范围:

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);
}

实施班级:

     @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;
       }
 }

根据您选择的日期返回结果。