2016-01-25 25 views
13

Tôi có Entity này và tôi muốn liệt kê cho mỗi thiết bị sự kiện cuối cùng với thông điệp hữu = 1Chọn hàng với ngày gần đây nhất cho mỗi người dùng với 1 điều kiện trong JPA

@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 { 
    .. 
} 

Nhưng tôi có một vấn đề khẳng định trong thử nghiệm cuối cùng, bởi vì nó xem xét device3 là sự kiện cuối cùng và không phải sự kiện đó.

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()); 
+0

Bạn có thể cung cấp chú thích của mình trên 'DeviceEvent.findWithMessageActive()', giải thích về nơi bạn đặt 'đã nhận' và kết quả mong đợi không? –

+0

Tôi nghĩ bạn nên thêm deviceEvent4.setMessage (1); vì mã này assertTrue ((numDevicesWithActiveMessage + 1) == deviceEventService.findWithActiveMessage(). size()); đang tìm kiếm một tin nhắn hoạt động nhưng device4 không có bất kỳ thông điệp nào. Vì vậy, cái mới nhất là device3. điều này có thể giúp bạn. – bipartite

Trả lời

8

tôi giả DeviceEvent.received được thiết lập trong newDeviceEvent() phương pháp và nó thiết lập để thời gian hiện tại.

Trong trường hợp như vậy không có sự chậm trễ giữa việc tạo deviceEvent3deviceEvent4, có thể họ sẽ có cùng thời gian trong trường received. Sau đó, truy vấn sẽ chọn tối đa tất cả received và theo điều kiện bên ngoài, nó sẽ chọn cả hai deviceEvent3deviceEvent4 chỉ có deviceEvent3 sẽ khớp với số có message bằng 1. Vì vậy, tôi tin rằng vì TEST xem xét device3 như một sự kiện cuối thực sự là chính xác (có lẽ hầu hết trừ khi đồng hồ đánh dấu giữa việc tạo ra hai sự kiện).

1

Bạn chưa đặt - deviceEvent4.setMessage(1). Do đó deviceEvent3 sẽ là sự kiện thiết bị mới nhất và do đó thử nghiệm của bạn dường như đang xem xét sự kiện thiết bị chính xác (deviceEvent3) là sự kiện mới nhất

4

Tại sao không tạo cột nhận dạng cho mỗi bản ghi được chèn vào. Đối với một cá thể, một ID tự động tăng khi chèn (nhận dạng). Từ đó, nó có thể trả lại giá trị mới nhất của ID đó và chúng tôi căn cứ dữ liệu của chúng tôi từ ID đang được trả về?

0

Tôi nghĩ bạn nên có thêm

deviceEvent4.setMessage(1); 

kể từ khi mã này

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

đang tìm kiếm một thông điệp tích cực nhưng device4 không có bất kỳ. Vì vậy, phiên bản mới nhất là device3.

Các vấn đề liên quan