2016-01-25 20 views
13

ho questa entità e voglio elencare per ogni dispositivo l'ultimo evento con il messaggio property = 1Selezionare la riga con la maggior parte della data recente per utente con 1 condizione in APP

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

Ma ho un problema di asserzione nell'ultimo test , perché considera device3 come ultimo evento e non è il caso.

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

Potete fornire le vostre annotazioni su 'DeviceEvent.findWithMessageActive()', spiegazione di dove avete impostato 'received' e risultato atteso? –

+0

Penso che dovresti aver aggiunto deviceEvent4.setMessage (1); poiché questo codice assertTrue ((numDevicesWithActiveMessage + 1) == deviceEventService.findWithActiveMessage(). size()); stava cercando un messaggio attivo ma device4 non ne ha. Quindi, l'ultimo è device3. questo può aiutarti. – bipartite

risposta

8

presumo DeviceEvent.received si trova in newDeviceEvent() metodo e che sia impostato l'ora corrente.

In tal caso non vi è alcun ritardo tra la creazione di deviceEvent3 e deviceEvent4, molto probabilmente avranno lo stesso tempo nel campo received. La query sceglierà quindi il massimo di tutti received e in base alle condizioni esterne selezionerà sia deviceEvent3 e deviceEvent4 per i quali solocorrisponderà a message uguale a 1.

Quindi credo che perché il TEST consideri device3 come Ultimo evento in realtà corretto (molto probabilmente a meno che gli orologi non ticchino tra la creazione dei due eventi).

1

Non hai impostato - deviceEvent4.setMessage(1). Quindi deviceEvent3 sarebbe l'ultimo evento del dispositivo e quindi il tuo test sembra considerare l'evento dispositivo corretto (deviceEvent3) come l'ultimo evento

4

Perché non creare una colonna di identità per ogni record da inserire. Per un'istanza, un ID che aumenta automaticamente all'inserimento (identità). Da lì, dovrebbe essere in grado di restituire l'ultimo valore di tale ID e basiamo i nostri dati sull'ID restituito?

0

penso che si dovrebbe aver aggiunto

deviceEvent4.setMessage(1); 

dal momento che questo codice

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

è alla ricerca di un messaggio attivo, ma device4 non ha alcuna. Quindi, l'ultimo è device3.