2016-01-25 48 views
13

mam tego podmiotu i chcę listy dla każdego urządzenia ostatnią imprezę z komunikatem property = 1Wybierz wiersz z najbardziej aktualne dla każdego użytkownika z 1 warunku w 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 { 
    .. 
} 

Ale mam problem twierdzenie w ostatnim teście , ponieważ uważa on device3 za ostatnie zdarzenie, a nie w tym przypadku.

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

Czy możesz podać swoje adnotacje w 'DeviceEvent.findWithMessageActive()', wyjaśnienie, gdzie ustawić "otrzymał" i oczekiwany wynik? –

+0

Myślę, że powinieneś dodać deviceEvent4.setMessage (1); ponieważ ten kod assertTrue ((numDevicesWithActiveMessage + 1) == deviceEventService.findWithActiveMessage(). size()); szukał aktywnej wiadomości, ale urządzenie4 jej nie ma. Tak więc ostatnim jest urządzenie3. może to ci pomoże. – bipartite

Odpowiedz

8

Zakładam DeviceEvent.received jest ustawiony w newDeviceEvent() metoda i to ustawienie aktualnego czasu.

W takim przypadku, ponieważ nie ma opóźnienia między utworzeniem deviceEvent3 i deviceEvent4, najprawdopodobniej będą one miały ten sam czas w polu received. Zapytanie następnie wybierze maksimum ze wszystkich received i zgodnie ze stanem zewnętrznym wybierze zarówno deviceEvent3 jak i deviceEvent4, dla których tylko deviceEvent3 będzie pasować, ponieważ ma message równe 1.

Więc uważam, że ponieważ TEST traktuje urządzenie3 jako ostatnie zdarzenie jest rzeczywiście poprawne (najprawdopodobniej chyba, że ​​zegary będą wskazywać pomiędzy utworzeniem dwóch zdarzeń).

1

Nie ustawiłeś - deviceEvent4.setMessage(1). W związku z tym deviceEvent3 będzie najnowszym wydarzeniem urządzenia i dlatego Twój test wydaje się rozważać prawidłowe zdarzenie urządzenia (deviceEvent3) jako ostatnie zdarzenie

4

Po co tworzyć kolumnę tożsamości dla każdego wpisu, który ma zostać wstawiony. Dla instancji identyfikator, który automatycznie zwiększa się po wstawieniu (tożsamość). Stamtąd powinno być możliwe zwrócenie ostatniej wartości tego identyfikatora, a nasze dane opieramy na zwracanym identyfikatorze?

0

myślę, że należy dodałem

deviceEvent4.setMessage(1); 

od tego kodu

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

szuka aktywnego wiadomości ale device4 nie ma żadnych. Tak więc najnowszym jest device3.