首页 > 解决方案 > Spring jpa 没有为 findFirstById_OrderByCreationDate_Desc 返回正确的记录

问题描述

我的测试中有一个非常愚蠢的问题。我@DataJpaTest用来在一个简单的存储库上运行一些简单的测试。我有一个名为的实体Event和一个应该始终返回最后一个条目的存储库接口。

但是,无论我做什么,我都会得到第一个条目。

@Entity
@Cacheable(false)
public class Event {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(optional = false)
    private Observed observed;

    private LocalDateTime creationDate;

    //Constructor that sets the observer and timestamp
    //getters and setters

}

我通过 JPA 查询:

public interface EventRepository extends JpaRepository<Event, Long> {

    Event findFirstById_OrderByCreationDate_Desc(@Nonnull Long id);

}

现在我希望这段代码能够执行以下操作。按事件的创建日期对事件进行排序,其中包含精确到毫秒的时间戳,将最后一个放在顶部,然后仅返回最后一个作为事件的结果。这似乎在实际应用程序中起作用。但在测试中,会发生以下情况。

@Test
public void createAndFindLastEvent() {
    Event event1 = new Event(observer);
    eventRepository.save(event1);
    Event event2 = new Event(observer);
    eventRepository.save(event2);
    Event event3 = eventRepository.findFirstById_OrderByCreationDate_Desc(observer.getId());
}

结果是event3包含 的值event1,即使event2具有较晚的时间戳。这让我很生气。我已经尝试saveAndFlush()在保存时flush()直接在存储库上使用,并且我已经放置@Cacheable(false)了实体类本身以确保不会发生奇怪的事情。我错过了什么吗?这不应该像我期望的那样工作吗?

最奇怪的部分是 afindAll()确实返回了两个事件,并且排序 ASC 或 DESC 似乎没有任何改变。

标签: springspring-bootspring-data-jpaspring-data

解决方案


尝试改变

Event findFirstById_OrderByCreationDate_Desc(@Nonnull Long id);

Event findFirstByObserved_IdOrderByCreationDateDesc(@Nonnull Long id);

它也应该在没有下划线的情况下工作

Event findFirstByObservedIdOrderByCreationDateDesc(@Nonnull Long id);

另见: 4.4.3。属性表达式和文章:SpringData:属性遍历

似乎在您的查询中您询问的是Event's Id。下划线似乎没有必要,因为不应该有歧义:如果你有,它们会很有用,例如observedId. Event在第一个选项 ( ) 中使用下划线...Observed_Id...可以解决该潜在问题。

检查了 sql 查询,使用下划线并没有什么不同。


推荐阅读