Spring-boot jpa如何找到具有最大值的实体

pas*_*ser 6 jpa linked-tables spring-boot

让我们告诉你我有两张桌子。

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));
Run Code Online (Sandbox Code Playgroud)

如何使用 spring-boot jpa 来请求这样的用户和最大积分?

select u.ID,max(p.points) from user u, points p where u.id=p.user_id
Run Code Online (Sandbox Code Playgroud)

或者有什么替代方案可以解决此类问题?

Dov*_*vmo 8

假设您RepositoryUser

public class User {
    private int id;
    private List<Point> points;
    ...
}
Run Code Online (Sandbox Code Playgroud)

与对象的关系Points

public class Point {
    private int id;
    private User User;
    private int points;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我还没有测试过,但你应该能够做到:

User findFirstByIdOrderByPointPointsDesc(int userId)
Run Code Online (Sandbox Code Playgroud)

与文档中的示例 18类似。

无论查询或 Spring Data 如何,您遇到的唯一问题是您是否有两个具有相同点值的用户。如果您需要更多关于打破平局的逻辑,那么编写一个@Query(带有您的查询,加上额外的平局打破逻辑)或一个@NativeQuery.


Suj*_*jit 5

我通常创建一个类来保存结果,例如

public class Result {

private User user;
private int votes;
// getters and setters 
}
Run Code Online (Sandbox Code Playgroud)

并在存储库中编写自定义查询来获取数据

@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();    
Run Code Online (Sandbox Code Playgroud)

将 com.package.Result 替换为 Result 类的适当路径。