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

时间:2016-01-25 19:39:54

标签: java sql jpa mysqli junit

我有这个实体,我想为每个设备列出属性message = 1

的最后一个事件
array([[0, 1, 2, 3, 4, 5, 6],
       [0, 1, 2, 3, 4, 5, 6]])

但是我在上一次测试中有一个断言问题,因为它认为@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

4 个答案:

答案 0 :(得分:8)

我认为在DeviceEvent.received方法中设置newDeviceEvent()并将其设置为当前时间。

在创建deviceEvent3deviceEvent4之间没有延迟的情况下,很可能它们在received字段中的时间相同。然后,查询将选择所有received的最大值,并根据外部条件选择deviceEvent3deviceEvent4deviceEvent3只匹配message 1等于i = getIntent(); dayOfWeek = i.getStringExtra("aKey"); weekDay.setText(dayOfWeek);

所以我相信因为TEST将device3视为Last事件实际上是正确的(除非时钟在创建两个事件之间打勾)。

答案 1 :(得分:4)

Why not create an identity column for each record to be inserted. For an instance, an ID which automatically increment upon insertion (identity). From there, it should be able to return the latest value of that ID and we base our data from the ID being returned?

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我认为你应该添加

deviceEvent4.setMessage(1);

自此代码

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

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