spring - 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 似乎没有任何改变。
解决方案
尝试改变
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 查询,使用下划线并没有什么不同。
推荐阅读
- asp.net-core - ASP.NET Core 不让我登录
- c# - Web Agora.io DYNAMIC_KEY_EXPIRED
- android - Playstore 向某些用户显示旧版本 虽然有新版本可用
- haskell - 我如何在我的班级中扩展 Haskell 的类型类
- javascript - 历史 API | 如何监听 forward() 事件
- angularjs - dataSource.filter 过滤在前端不可见的 ID
- azure-ad-b2c - 带有 Rest API 的 Azure B2C 自定义策略未在请求中发送 objectId
- java - 为什么当我尝试在这个百分比计算器中将我的 int 转换为 double 时结果总是 0
- java - Java类型擦除
- python - 机器人框架替换多个单词的功能