【问题标题】:Select row with most recent date per user with 1 condition in JPA在 JPA 中选择具有 1 个条件的每个用户最近日期的行
【发布时间】:2016-05-02 06:03:18
【问题描述】:

我有这个实体,我想为每个设备列出属性 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.findWithMessageActive() 上提供您的注释,说明您在哪里设置received 以及预期结果?
  • 我认为你应该添加 deviceEvent4.setMessage(1);因为这段代码 assertTrue ((numDevicesWithActiveMessage+1) == deviceEventService.findWithActiveMessage().size());正在寻找活动消息,但 device4 没有任何消息。因此,最新的是 device3。这对你有帮助吗?

标签: java sql jpa junit


【解决方案1】:

我假设DeviceEvent.received 设置在newDeviceEvent() 方法中,并且设置为当前时间。

在创建deviceEvent3deviceEvent4 之间没有延迟的情况下,它们很可能在received 字段中具有相同的时间。然后查询将选择所有received 中的最大值,并根据外部条件选择deviceEvent3deviceEvent4,只有deviceEvent3 匹配,因为它的message 等于1

所以我相信因为 TEST 将 device3 视为最后一个事件实际上是正确的(很可能除非时钟在两个事件的创建之间滴答作响)。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您尚未设置 - deviceEvent4.setMessage(1)。因此deviceEvent3 将是最新的设备事件,因此您的测试似乎将正确的设备事件 (deviceEvent3) 视为最新事件

      【讨论】:

        【解决方案4】:

        我认为你应该添加

        deviceEvent4.setMessage(1);
        

        因为这段代码

        assertTrue ((numDevicesWithActiveMessage+1) == deviceEventService.findWithActiveMessage().size());
        

        正在寻找活动消息,但 device4 没有任何消息。 因此,最新的是 device3。

        【讨论】:

          猜你喜欢
          • 2013-06-06
          • 2017-11-22
          • 2015-05-26
          • 1970-01-01
          • 2015-06-21
          • 1970-01-01
          • 2016-05-08
          • 1970-01-01
          • 2011-10-04
          相关资源
          最近更新 更多