簡體   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