假设我有两个对象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;上添加约束。字段,以便只检索一个月内的记录,我可以遍历它们,而不必担心不必要的数据库提取?
谢谢!
答案 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;
}
}
根据您选择的日期返回结果。