我很难弄清楚这一点。问题是,我有一个包含特定游戏中用户得分的表格。所以,我有 2 个实体,称为用户和游戏。用户与游戏没有直接关系,但 ai 在数据库中有一个视图,该视图具有以下字段:
public UserScore implements Serializable {
@Id
@ManyToOne
private Game game;
@Id
@ManyToOne
private User user;
private Long score;
}
所以,我需要的是,给定一个用户和一个游戏,我需要根据他的分数在那个游戏中对这个用户进行分类。执行此操作的 SQL 查询如下:
select user.name as name,
scores.score as myScore,
count(distinct countScores.score) as classification
from user INNER JOIN userscore as scores ON user.id = scores.user_id,
userscore as countScores
where user.id = 66 and scores.game_id = 666
and countScores.game_id = 666 and countScores.score > scores.score
group by user.id;
假设66是你想要分类位置的用户ID,666是你正在考虑的游戏的ID。所以,这行得通,但是如何将其转换为 Hibernate 标准 API?由于我无法创建具有多个根实体的条件,因此我尝试执行以下操作:
DetachedCriteria countCriteria = DetachedCriteria.forClass(UserScore.class, "countScores")
.add(Restrictions.eq("game.id", 666))
.add(Restrictions.gtProperty("score", "scores.score"))
.setProjection(Projections.countDistinct("score"));
this.session.createCriteria(User.class)
.add(Restrictions.eq("id", 66))
.createAlias("userScore", "scores", JoinType.INNER_JOIN, Restrictions.eq("game", 666))
.setProjection(Projections.projectionsList()
.add(Projections.property("name"), "name")
.add(Projections.property("scores.score"), "myScore")
.add(Projections.groupProperty("id"))
// Here is where this is killing me:
// .add(Projections.SOMETHING(countCriteria), "classification")
);
...
所以,这就是问题所在,我如何在返回集中选择子查询的结果作为字段?必须有办法做到这一点,否则我没有解决这个困境的想法。
先感谢您。