Spring-boot jpa 如何找到具有最大值的实体
Spring-boot jpa how to find entity with max value
假设我有两个表。
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
或者解决此类问题的任何替代方法?
假设您有 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)
无论查询或 Spring 数据如何,您遇到的唯一问题是如果您有两个用户具有相同的点值。如果您需要更多有关打破平局的逻辑,那么编写 @Query
(使用您的查询,加上额外的平局逻辑)或 @NativeQuery
.
可能更值得
我通常创建一个 class 来保存结果,例如
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 替换为结果 class 的适当路径。
创建数据模型。
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();
下面的方法可以写在Repo中,像dao层中的Transaction一样使用,可以从service层访问。
@Query(value = "SELECT max(transactionId) FROM TransactionPayloadInfo")
int getMaxTransactionId();
假设我有两个表。
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
或者解决此类问题的任何替代方法?
假设您有 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)
无论查询或 Spring 数据如何,您遇到的唯一问题是如果您有两个用户具有相同的点值。如果您需要更多有关打破平局的逻辑,那么编写 @Query
(使用您的查询,加上额外的平局逻辑)或 @NativeQuery
.
我通常创建一个 class 来保存结果,例如
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 替换为结果 class 的适当路径。
创建数据模型。
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();
下面的方法可以写在Repo中,像dao层中的Transaction一样使用,可以从service层访问。
@Query(value = "SELECT max(transactionId) FROM TransactionPayloadInfo")
int getMaxTransactionId();