繁体   English   中英

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

[英]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()方法中设置的,并且它被设置为当前时间。

在创建deviceEvent3deviceEvent4之间没有延迟的情况下,它们很可能在received字段中具有相同的时间。 然后查询将选择所有received的最大值,并根据外部条件选择deviceEvent3deviceEvent4 ,只有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM