2017-02-23 18 views
1

ここでは状況があります。私は複数の多対多の関係を持つ1つのテーブルを持っています。 複数のテーブルからのActiveJDBC選択レコード集計

game (id, name, year_release ...) 
game_price (game_id, price_id, amount) 
price(id, label -- new game, used game) 
category(id, name) 
game_category(game_id, category_id) 
ここで、各ゲーム、価格のリスト、およびカテゴリのリストで20のゲームのリストを選択します。

はSQLで私はここに例があり、この

select game.id, game.name string_agg(price.label||':'game_price.amount), string_agg(category.name) 
from game 
left join game_price gp on (game.id = gp.game_id) 
left join price on (price.id = price_id) 
left join game_category gc on (game.id = gc.game_id) 
left join category on (category.id = category_id) 
group by game.id 

ような何かをするだろう:http://javalite.io/lazy_and_eagerための1対多、多対多のために何も。

最初にすべてのgame_priceをロードしてから、すべてのgame_categoryをロードする必要がありますか?

List<GamesPrices> gamesPrices = GamesPrices.findAll(Game.class, Price.class) 
List<GamesCategories> gamesCategories = GamesCategories.findAll(Game.class, Category.class) 

しかし、各ゲームのすべての情報を取得するにはどのようにループできますか?

答えて

1

それを行うには2つの方法があります。モデルと

:モデルなし

List<Game> games = Game.where(criteria, param1, param2).include(Price.class, Category,class).limit(20); 
for(Game g: games){ 
    List<Price> prices = g.getAll(Price.class); 
    List<Category> categories = g.getAll(Category.class); 
} 

String sql = "select game.id, game.name string_agg(price.label||':'game_price.amount), string_agg(category.name)" + 
"from game" + 
"left join game_price gp on (game.id = gp.game_id)" + 
"left join price on (price.id = price_id)" + 
"left join game_category gc on (game.id = gc.game_id)" + 
"left join category on (category.id = category_id)" + 
"group by game.id"; 

List<Map> results = Base.findAll(sql); 

私はそれが役に立てば幸い!

+0

私は第2の解決策をとった。モデルゲームはモデル価格に関連付けられていないため、最初のゲームは機能しません。このエラーが発生しました:java.lang.IllegalArgumentException:モデル:com.myapp.models.Priceがcom.myapp.models.Gameに関連付けられていません。しかし、2番目のソリューションは完璧です:) – Rony

関連する問題