Как получить последние данные с помощью JPA Query - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть таблица в базе данных mysql (транзакция хранилища). В нем есть столбцы: itemid, warehouseid, дата, движение (в количествах) и баланс.

Пример:

Id | Date             | ItemId | WarehouseId | Movement | Balance
1  | 01-01-2020 01:00 | 1      | 1           |      100 |    100
2  | 01-01-2020 02:00 | 1      | 1           |      -10 |     90
3  | 01-01-2020 03:00 | 3      | 1           |       50 |     50
4  | 01-01-2020 03:00 | 1      | 1           |       -5 |     85
5  | 02-01-2020 01:00 | 1      | 1           |       -5 |     80
6  | 02-01-2020 02:00 | 1      | 1           |      -10 |     70
7  | 02-01-2020 03:00 | 2      | 1           |      200 |    200
8  | 04-01-2020 01:00 | 1      | 1           |      -20 |     50
9  | 04-01-2020 02:00 | 2      | 1           |      -20 |    180

Итак, если я хочу узнать позиции баланса на складе 1 на 02-01-2020, это должно дать мне результат:

3  | 01-01-2020 03:00 | 3      | 1           |       50 |     50
6  | 02-01-2020 02:00 | 1      | 1           |      -10 |     70
7  | 02-01-2020 03:00 | 2      | 1           |      200 |    200

Идентификаторы 3, 6 и 7 являются последней записью для ItemId 1, ItemId 2 и ItemId 3.

Возможно ли это получить этот результат в одном запросе JPA? Если да, может ли кто-нибудь помочь мне с запросом? или может быть mysql запрос?

Моя цель, я хочу выполнить один запрос, чтобы избежать нескольких запросов.

Я могу получить его в одном запросе для каждого товара и склада. Это нормально, когда есть 10 предметов. Но когда есть 100 или более элементов, он будет выполнять более 100x запросов.

Спасибо.

1 Ответ

0 голосов
/ 21 февраля 2020

Я не думаю, что требуемый запрос может быть написан на JPQL. Но в JPA у вас всегда есть возможность выполнить собственный запрос.

SQL для получения необходимых результатов будет выглядеть примерно так:

select * from TRANSACTION_TABLE T1 
where T1.warehouseid = ?1 
and T1.date = (
    select max(date) from TRANSACTION_TABLE T2 
    where T2.date < ?2 
    and T2.itemid = T1.itemid
    and T2.warehouseid = T1.warehouseid
)

(Второй параметр будет желаемая дата плюс один день).

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