如何加快外国收藏的急切加载?

时间:2016-11-08 10:10:41

标签: java performance sqlite ormlite foreign-collection

我有一个用ORMlite映射的数据库表,它包含一些数据(18列),它还包含ForeignCollectionField(eager = true)

问题是从此表加载所有数据时... ORMlite正在使用连接为每个项创建查询。这导致了67124次查询并永远从该表中加载所有对象。

然而,这可以在几秒钟内在右连接查询中完成?为什么要生成数千个查询呢?

如何加快速度?我是否必须编写原始查询然后编写RawRowMapper,这使得使用ORM毫无意义..

如何处理在ormlite中加载渴望的集合?因为queryForAll不是..

1 个答案:

答案 0 :(得分:1)

  

问题是从此表加载所有数据时... ORMlite正在使用连接为每个项创建查询。这导致了67124次查询并永远从该表中加载所有对象。

原因是ORM_Lite_。很多人都要求加入对外国收藏品的支持,但我还没有得到它。这不容易。

如果您仍想使用ORMLite,那么我建议使用eager = true并执行2次查询。使用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

希望这有帮助。