如何使用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 结果基于您选择的日期。
假设我有两个对象 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 结果基于您选择的日期。