0

我很难弄清楚这一点。问题是,我有一个包含特定游戏中用户得分的表格。所以,我有 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")
    );
...

所以,这就是问题所在,我如何在返回集中选择子查询的结果作为字段?必须有办法做到这一点,否则我没有解决这个困境的想法。

先感谢您。

4

1 回答 1

0

您可以创建另一个DetachedCriteria,然后像这样加入它们:

someNewDetachedCriteria.add(Subqueries.propertyEq("classification", countCriteria));
于 2013-07-22T23:47:03.413 回答