2010-09-17 40 views
23

tôi cần phải làm truy vấn SQL này với DetachedCriteria:Hibernate Tiêu chuẩn Subquery

SELECT g.id FROM games g 
WHERE NOT EXISTS (
    SELECT 1 FROM users_games ug WHERE ug.user_id = 1 AND g.id = ug.game_id) 

Ý tưởng là để có được id từ các trò chơi mà không phải thuộc sở hữu của người sử dụng. tôi đã cố gắng như 10 cách tiếp cận khác nhau với DetachedCriteria nhưng tôi nhận được "thực thể Unknown: null" MappingException Mã nên trông giống như:

DetachedCriteria subquery = DetachedCriteria.forClass(UserGame.class, "ug") 
    .add(Restrictions.eq("ug.user.id", 1)) 
    .add(Restrictions.eqProperty("ug.game.id","u.id")); 
DetachedCriteria criteria = DetachedCriteria.forClass(Game.class, "g") 
    .add(Subqueries.notExists(subquery)); 

Setting cũng là dự báo trở lại chỉ id của các trò chơi.

Bất kỳ ý tưởng nào? Tôi nghĩ rằng Hibernate có một số rắc rối khi tham gia các truy vấn không có bí danh. Thêm bí danh hoạt động nhưng kết quả là sai.

+0

Bạn không ánh xạ liên kết giữa "trò chơi" và "user_games" trong đối tượng/ánh xạ của bạn? –

+0

user_games có ánh xạ tới các trò chơi nhưng không phải là viceversa – Gonzalo

Trả lời

19

Bạn cần phải thêm một bí danh, như sau:

DetachedCriteria subquery = DetachedCriteria.forClass(UserGame.class, "ug") 
    .addAlias("ug.user", "user") 
    .add(Restrictions.eq("user.id", 1)) 
    .addAlias("ug.game", "game") 
    .add(Restrictions.eqProperty("game.id","u.id")); 

Điều đó sẽ giúp

-3

Hãy thử

SELECT g.id FROM users_games ug join ug.game g 
WHERE NOT EXISTS (SELECT 1 FROM WHERE ug.user_id = 1) 
+5

Việc bỏ qua vì câu hỏi của OP là về cách thực hiện điều này trong Hibernate, không phải trong SQL thô. Ngoài ra, "FROM WHERE" sẽ là một lỗi cú pháp trong SQL. –

11

Bạn cần một dự báo và quy định cụ thể mà thuộc tính mà cần phải được xuất hiện.

DetachedCriteria subquery = DetachedCriteria.forClass(UserGame.class, "ug") 
.add(Restrictions.eq("ug.user.id", 1)) 
.add(Restrictions.eqProperty("ug.game.id","u.id")) 
.setProjection(Projections.property("ug.game.id")); 

DetachedCriteria criteria = DetachedCriteria.forClass(Game.class, "g") 
.add(Property.forName("g.id").notIn(subquery)); 

Tôi hy vọng điều đó sẽ hữu ích.

Các vấn đề liên quan