SQL Jpa,从group by中选择最后一行

use*_*093 2 java jpa jpql

我需要在表格位置返回每个设备的最后一行

我的表名是:位置

+------------+----------+--------------+--------------+----------+  
| locationId | deviceId | dataRegistro | horaRegistro | location |  
+------------+----------+--------------+--------------+----------+  
|         50 |        1 |   2012-11-07 |     15:35:00 |      A12 |  
+------------+----------+--------------+--------------+----------+  
|         51 |        1 |   2012-11-07 |     15:37:40 |       B2 |  
+------------+----------+--------------+--------------+----------+  
|         52 |        2 |   2012-11-07 |     15:35:12 |       B8 |  
+------------+----------+--------------+--------------+----------+  
|         53 |        2 |   2012-11-07 |     15:35:40 |      50C |  
+------------+----------+--------------+--------------+----------+  
|         54 |        2 |   2012-11-07 |     15:40:00 |      94A |  
+------------+----------+--------------+--------------+----------+  
Run Code Online (Sandbox Code Playgroud)

从我选择的一个设备的最后一行中选择

select L from Location L where deviceId = :deviceId order by "dataRegistro" DESC, "horaRegistro" DESC limit 1

现在如何选择每个设备的所有最新位置?:(我使用Java JPA.

谢谢,

伊万德罗

ppe*_*rka 5

如果ID是有序的,那么后面记录的记录对应于以后的日期,你可以使用这个查询(我不打算将字符串转换为日期,这会使它慢于可接受的.):

select L from Location L where deviceId = :deviceId order by L.locationId DESC 
Run Code Online (Sandbox Code Playgroud)

并限制在Java代码中返回的行数:

//EntityManager em; defined earlier
Query q = em.createQuery("select L from Location L where deviceId = :deviceId order by L.locationId DESC ");
q.setParameter("deviceId", "theDeviceIdIWantToQuery");
q.setMaxResults(1);
List<Location> results=query.getResultList();
Run Code Online (Sandbox Code Playgroud)

如果没有给定deviceId的行,或者包含1个Location项的List - 最后一个,则这将是一个空列表.

如果要一次性为所有设备选择最新位置,可以使用IN子句和子查询:

select L2 FROM Location L2 WHERE L2.locationId IN
    (select L.locationId from Location L 
    where L.deviceId = :deviceId 
    order by L.locationId DESC 
    group by L.deviceId)
Run Code Online (Sandbox Code Playgroud)

遗憾的是,JPQL不允许在FROM子句中使用子查询,因此虽然这是我选择这样做的,但只能使用本机查询功能,这样使用起来会更加不方便.

顺便说一句,在我看来,像你这样存储时间戳是一种不好的做法.它没有正确的可索引性,在查询和订购时会给您带来麻烦,只是一场普通的噩梦.我会认真重新考虑你的架构的这一部分.