我正在努力解决这个问题。 问题是,我有一个表格,其中包含特定游戏中用户的得分。 所以,我有2个实体叫做用户和游戏。 用户与游戏没有直接关系,但我在数据库中有一个具有以下字段的视图:
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? 由于我无法创建具有多个根实体的Criteria,因此我尝试执行以下操作:
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")
);
...
所以,这就是问题,如何在返回集中选择一个字段作为子查询的结果? 必须有办法做到这一点,否则我没有想法来解决这个困境。
提前谢谢。
答案 0 :(得分:0)
您可以创建另一个DetachedCriteria
然后加入它们,如:
someNewDetachedCriteria.add(Subqueries.propertyEq("classification", countCriteria));