Spring-boot jpa как найти сущность с максимальным значением
Скажем, у меня есть две таблицы.
CREATE TABLE user (ID int AUTO_INCREMENT,PRIMARY KEY (ID));
CREATE TABLE points (ID int AUTO_INCREMENT, user_id int, points int,PRIMARY KEY (ID));
Как я могу использовать Spring-Boot Jpa для запроса пользователя и максимальные баллы, как это?
select u.ID,max(p.points) from user u, points p where u.id=p.user_id
Или какие-либо альтернативы для решения такого рода проблем?
3 ответа
Я обычно создаю класс для хранения результатов, таких как
public class Result {
private User user;
private int votes;
// getters and setters
}
И написать собственный запрос в хранилище, чтобы получить данные
@Query(value = "SELECT new com.package.Result (u, MAX (p.points) )
FROM user u
JOIN points p
ON u.id = p.user_id
GROUP BY u")
List<Result> getPointsPerUser();
Замените com.package.Result соответствующим путем к классу Result.
Если у вас есть Repository
из User
:
public class User {
private int id;
private List<Point> points;
...
}
С отношением к Points
объект:
public class Point {
private int id;
private User User;
private int points;
...
}
Я не проверял, но вы должны быть в состоянии сделать:
User findFirstByIdOrderByPointPointsDesc(int userId)
Аналогичен примеру 18 в док.
Единственная проблема, которая возникает у вас, независимо от запроса или данных Spring, - это если у вас два пользователя с одинаковыми значениями баллов. Если вам нужно больше логики для разрыва связей, возможно, стоит написать @Query
(с вашим запросом плюс дополнительная логика разрыва связей) или @NativeQuery
,
Ниже метод может быть написан в репо и использован как транзакция, как на уровне dao, который будет доступен из уровня сервиса.
@Query(значение = "ВЫБРАТЬ max(transactionId) FROM TransactionPayloadInfo") int getMaxTransactionId();
Создать модель данных.
public class Data {
private int id;
private int maxPoints;
// getters and setters method
}
И напишите свой запрос, чтобы получить модель данных.
@Query(select packagename.Data(u.ID,max(p.points) ) from user u, points p where u.id=p.user_id)
Data findUserWithMaxVots();