2016-11-08 6 views
0

私はORMliteでマップされたデータベーステーブルを持っていますが、それにはいくつかのデータ(18列)が含まれており、ForeignCollectionField(eager = true)も含まれています。海外のコレクションを熱心に読み込む方法を教えてください。

問題は、このテーブルからすべてのデータをロードするときです... ORMliteは、ジョインを使用する代わりにすべてのアイテムのクエリを作成しています。これは67124のクエリをもたらし、このテーブルからすべてのオブジェクトを永久にロードすることになります。

しかし、これは数秒で右結合クエリで実行できますか?代わりに何千ものクエリを生成するのはなぜですか?

どのように高速化できますか?ロークエリを作成してRawRowMapperを作成する必要がありますが、ORMを無意味に使用しています。

ormliteにeagerコレクションを読み込む方法を教えてください。 queryForAllは道ではありません。

+0

なぜすべてのデータをロードしようとしていますか? ORMは、「すべてのデータをロードする」唯一の有効な理由であるレポートまたはETL用ではありません。これにはストアドプロシージャまたはビューを使用します。あなたが書いているのは、熱心な負荷を使って修正する必要がある 'N + 1'問題です。どのようにクエリを作成しており、どのようにマッピングを定義しましたか? –

+0

PS ORMs *は実際には報告やETLのためのものではありません。これは単なる学問的な話です。ドメインロジックを適用しない場合は、行と値をオブジェクトに変換することで何も得られません。 –

+0

この場合、すべてのデータをロードする必要があります。すべてのデータは3Dグラフで後で表示され、シミュレーションに使用されます...これには大きなドメインロジックがあります。このテーブルにはもっと多くのカラムがあり、データベース全体にはもっと多くのテーブルがありますが、今回はすべてのロードを遅くする必要があります。たとえ大きなドメインロジックがなくても、すべてのデータを最初からロードしていても、 XMLファイル全体を書き換えるのではなく、実行時に列を更新できるので、このデータを保存することができます。 –

答えて

1

問題は、このテーブルからすべてのデータをロードするときです... ORMliteは、ジョインを使用する代わりに、すべてのアイテムのクエリを作成しています。これは67124のクエリをもたらし、このテーブルからすべてのオブジェクトを永久にロードすることになります。

これは理由によるORM_Lite_です。たくさんの人が外国の徴収に参加することを依頼しましたが、私はまだそれに慣れていません。簡単ではない。

まだORMLiteを使用したい場合はではなく、eager = trueを使用し、代わりに2つのクエリを実行することをおすすめします。 1つの主項目の照会と、INを使用するコレクション・エンティティーに関連付けられたDAOを使用する別の照会。次のようなものがあります。

qb = accountDao.queryBuilder(); 
qb.where()...; 
List<Account> accounts = qb.query(); 

// build a list of account-ids 
List<Long> accountIds = new ArrayList<>(); 
for (Account account : accounts) { 
    accountIds.add(account.getId()); 
} 

// now use this list of ids to get your other entities 
List<Order> orders = orderDao.queryBuilder().where().in("accountId", accountIds).query(); 
// now you have a list of orders for all of your ids 
// you will need to associate each order with its account 

希望します。

関連する問題