我们假设我收集的所有费率均来自AbstractRate
@MappedSuperclass
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "name")
@Table(name = "rates")
public abstract class AbstractRate {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@Column(precision = 13, scale = 4)
private BigDecimal value;
@OneToOne
private EffectiveDate effectiveDate;
...
}
并且,所有人都有一个EffectiveDate:
@Entity
public class EffectiveDate {
@Id
private LocalDateTime date;
...
}
(我承认,对于这个模型,一个单独的日期对象有点过度杀死,但是它允许我绑定数据库中的多个速率和其他数字。)
现在,我想获得一个特定的费率,比如说SalaryRate
,这个费率在某个特定日期生效。我可以做点像
salaryRateRepository.findByEffectivedate(
effectiveDateRepository.findTopByDateLessThanEqualOrderByDateDesc(sampleDate)
);
这应该有效地给我一个MAX(date)
及其匹配率。这是查询这些东西的正确方法吗?一些帖子建议
作为附加选项,我有Querydsl设置,存储库扩展QuerydslPredicateExecutor
。但是,我并不熟悉Querydsl的语法是如何工作的。
答案 0 :(得分:0)
我认为findTopByDateLessThanEqualOrderByDateDesc(sampleDate)
一切正常。
另一种变体应该是:
@Query(value = "select * from effective_date ed where ed.date <= ?1 order by ed.date desc limit 1", nativeQuery = true)
EffectiveDate findEffectiveDate(LocalDateTime dateTime);
或
Predicate p = QEffectiveDate.effectiveDate.date.loe(sampleDate);
Pageable page = new PageRequest(0, 1, new Sort(Sort.Direction.DESC, "date"));
//...
EffectiveDate effectiveDate = effectiveDateRepository.findAll(p, page).getContent().stream().findFirst().orElse(null);
(未经测试......)