如何使用JPA选择最接近日期的记录?

时间:2017-07-11 17:55:59

标签: spring-data

我们假设我收集的所有费率均来自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的语法是如何工作的。

1 个答案:

答案 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);

(未经测试......)