[英]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()
方法中設置的,並且它被設置為當前時間。
在創建deviceEvent3
和deviceEvent4
之間沒有延遲的情況下,它們很可能在received
字段中具有相同的時間。 然后查詢將選擇所有received
的最大值,並根據外部條件選擇deviceEvent3
和deviceEvent4
,只有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.