Выберите последнюю запись для каждого идентификатора весны jpa - PullRequest
0 голосов
/ 09 марта 2020

У меня есть такая сущность:

@Entity
class Point{
    @EmbeddedId
    private PointIdentity pointIdentity;
    private float latitude;
    private float longitude;

    @Embeddable
    public static class PointIdentity implements Serializable {
        private Long id;
        private ZonedDateTime timestamp;
    }
}

Существует EmbeddedId, поэтому в столбце "id" может быть несколько записей с одинаковыми идентификаторами.

И мне нужно получить последнюю запись для каждого идентификатора, используя спецификации CriteriaQuery и JPA, я думаю, но не знаю как.

В SQL это будет примерно так:

SELECT id, MAX(timestamp) 
FROM geodata 
GROUP BY id

Есть ли способ сделать это?

Любая помощь, спасибо.

1 Ответ

1 голос
/ 10 марта 2020

Вы можете легко написать запрос JPQL:

TypedQuery<Object[]> query = entityManager.createQuery(
    "select p.pointIdentity.id, max(p.pointIdentity.timestamp) from Point p group by p.pointIdentity.id",
    Object[].class);
List<Object[]> results = query.getResultList();

, что означает:

select
    point0_.id as col_0_0_,
    max(point0_.timestamp) as col_1_0_ 
from
    point point0_ 
group by
    point0_.id

В качестве альтернативы вы можете использовать критерий запроса:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Object[]> query = criteriaBuilder.createQuery(Object[].class);
Root<Point> point = query.from(Point.class);
query.groupBy(point.get("pointIdentity").get("id"));
query.multiselect(
        point.get("pointIdentity").get("id"),
        criteriaBuilder.max(point.get("pointIdentity").get("timestamp"))
);
TypedQuery<Object[]> typedQuery = entityManager.createQuery(query);
List<Object[]> results = typedQuery.getResultList();

который производит идентичные SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...