[英]Select row with most recent date per user with 1 condition in JPA
我有这个实体,我想为每个设备列出最后一个带有属性 message = 1 的事件
@Entity
@Table(name = "t_device_event")
@NamedQueries(value = {
@NamedQuery(name = "DeviceEvent.findWithMessageActive",
query = "from DeviceEvent as de1 where de1.message = 1 and de1.received = "
+ " ( select max(de2.received) from DeviceEvent de2 "
+ " where de2.device.id = de1.device.id ) "), )
public class DeviceEvent {
..
}
但是我在最后一次测试中有一个断言问题,因为它将device3
视为最后一个事件,而事实并非如此。
assertTrue ((numDevicesWithActiveMessage+1) == deviceEventService.findWithActiveMessage().size());
DeviceEvent deviceEvent3 = newDeviceEvent();
deviceEvent3.setMessage(1);
deviceEventService.save(deviceEvent3);
DeviceEvent deviceEvent4 = newDeviceEvent();
deviceEventService.save(deviceEvent4);
assertTrue ((numDevicesWithActiveMessage+1) == deviceEventService.findWithActiveMessage().size());
我假设DeviceEvent.received
是在newDeviceEvent()
方法中设置的,并且它被设置为当前时间。
在创建deviceEvent3
和deviceEvent4
之间没有延迟的情况下,它们很可能在received
字段中具有相同的时间。 然后查询将选择所有received
的最大值,并根据外部条件选择deviceEvent3
和deviceEvent4
,只有deviceEvent3
匹配,因为它的message
等于1
。
所以我相信因为 TEST 将 device3 视为最后一个事件实际上是正确的(很可能除非时钟在两个事件的创建之间滴答作响)。
为什么不为要插入的每条记录创建一个标识列。 例如,插入时自动递增的 ID(身份)。 从那里,它应该能够返回该 ID 的最新值,并且我们根据返回的 ID 建立我们的数据?
您尚未设置 - deviceEvent4.setMessage(1)
。 因此deviceEvent3
将是最新的设备事件,因此您的测试似乎将正确的设备事件 (deviceEvent3) 作为最新事件
我认为你应该添加
deviceEvent4.setMessage(1);
因为这段代码
assertTrue ((numDevicesWithActiveMessage+1) == deviceEventService.findWithActiveMessage().size());
正在寻找活动消息,但 device4 没有任何消息。 因此,最新的是device3。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.