Spring-boot jpa как найти сущность с максимальным значением - PullRequest
0 голосов
/ 10 января 2019

Скажем, у меня есть две таблицы.

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 ]

0 голосов
/ 11 января 2019

Я обычно создаю класс для хранения результата, например

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.

0 голосов
/ 11 января 2019

создать модель данных.

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();
0 голосов
/ 11 января 2019

Если у вас есть 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.

...