2013-07-22 50 views
0

我很難弄清楚這一點。 問題是,我有一個包含特定遊戲中用戶分數的表格。 所以,我有2個實體稱爲用戶和遊戲。 用戶有一個遊戲沒有直接關係,而艾在具有以下字段中輸入數據庫視圖:hibernate - 如何基於使用Criteria API的子查詢進行投影?

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是你想要的分類位置和666,你們考慮遊戲的ID的用戶的ID。 所以,這個工作,但如何將其轉化爲Hibernate標準API? 既然不能創建多個根實體的標準,我t​​ryed做到以下幾點:

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

據我所知,'DetachedCriteria'只能用作限制,它可能不是更多鈔票從一個子查詢獲取數據與標準... – Ziul

+0

SQL中的東西看起來不對。 'scores'和'countScores'都是同一個表'userscore'的別名。所以條件'countScores.score> scores.score'將導致查詢總是返回0條記錄。 – yair

回答

0

您可以創建另一個DetachedCriteria,然後加入他們的行列,如:

someNewDetachedCriteria.add(Subqueries.propertyEq("classification", countCriteria)); 
相關問題