在 JPA 中选择具有 1 个条件的每个用户的最近日期的行

2022-09-04 21:22:26

我有这个实体,我想为每个设备列出属性消息 = 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());

答案 1

我假设是在方法中设置的,并且它设置为当前时间。DeviceEvent.receivednewDeviceEvent()

在这种情况下,创建 和 之间没有延迟,它们很可能在字段中具有相同的时间。然后,查询将选择所有条件的最大值,并根据外部条件选择两者,并且仅匹配,因为它等于 。deviceEvent3deviceEvent4receivedreceiveddeviceEvent3deviceEvent4deviceEvent3message1

因此,我相信,因为TEST将 device3 视为 Last 事件实际上是正确的(除非时钟在创建两个事件之间滴答作响)。


答案 2

为什么不为要插入的每条记录创建一个标识列。对于实例,插入时自动递增的 ID(标识)。从那里,它应该能够返回该ID的最新值,并且我们从返回的ID开始我们的数据?


推荐