hibernate - 如何使用Criteria API基于子查询进行投影?

时间:2013-07-22 19:49:33

标签: java hibernate

我正在努力解决这个问题。 问题是,我有一个表格,其中包含特定游戏中用户的得分。 所以,我有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")
    );
...

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

提前谢谢。

1 个答案:

答案 0 :(得分:0)

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

someNewDetachedCriteria.add(Subqueries.propertyEq("classification", countCriteria));