0

ORMlite でマップされたデータベース テーブルがあり、いくつかのデータ (18 列) が含まれており、ForeignCollectionField(eager = true).

問題は、このテーブルからすべてのデータをロードするときです... ORMlite は、結合を使用する代わりにすべての項目に対してクエリを作成しています。その結果、67124 個のクエリが発生し、このテーブルからすべてのオブジェクトをロードするのに永遠に時間がかかります。

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

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

ormliteで熱心なコレクションをロードする方法は? 仕方ないからqueryForAll..

4

1 に答える 1

1

問題は、このテーブルからすべてのデータをロードするときです... ORMlite は、結合を使用する代わりにすべての項目に対してクエリを作成しています。その結果、67124 クエリが発生し、このテーブルからすべてのオブジェクトをロードするのに永遠に時間がかかります。

理由により ORM_Lite_ です。多くの人が海外コレクションへの参加サポートを求めてきましたが、まだ実現していません。簡単ではない。

それでも ORMLite を使用したい場合は、代わりに 2 つのクエリを使用せずに実行することをお勧めします。eager = trueメイン アイテムに対して 1 つのクエリを実行し、次に を使用してコレクション エンティティに関連付けられた DAO を使用して別のクエリを実行しますIN。何かのようなもの:

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

お役に立てれば。

于 2016-11-15T23:23:42.220 に答える