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

Nuñ*_*ada 13 java sql junit mysqli 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 {
     ..
}
Run Code Online (Sandbox Code Playgroud)

但是在最后一次测试中我有一个断言问题,因为它认为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());
Run Code Online (Sandbox Code Playgroud)

Zby*_*000 8

我假设DeviceEvent.receivednewDeviceEvent()方法中设置,它设置为当前时间.

在这种情况下,创建之间没有延迟,deviceEvent3并且deviceEvent4很可能它们将在received现场具有相同的时间.那么该查询将选择最大所有的received,并根据外部条件会选择这两个deviceEvent3deviceEvent4用于仅仅deviceEvent3将匹配,因为它有message相等1.

所以我相信因为TEST认为device3作为Last事件实际上是正确的(最有可能除非时钟在两个事件的创建之间打勾).