首页 > 解决方案 > 如何从 `txn.getAll("Entity")` 方法获取子集结果?

问题描述

这是获取实体列表的示例代码,例如 User s

final EntityIterable allUsers = txn.getAll("User); // returns million records for example
for (Entity user: allUsers) {
    System.out.println(user.getProperty("fullName"));
}

我的问题是,如果用户存储有数百万条记录,我们如何才能只获得结果的子集?就像通过 Xodus API 可以实现跳过限制一样,还是我们真的需要对其进行编程以迭代所有条目并手动进行分区?在 Xodus 中获取实体子集的最有效和最快的方法是什么?

这是我们试图解决的完整示例实现:

@Override
public List<User> listUsers(String instance, final String storeName, long skip, long limit) {
    final List<User> users = new LinkedList<>();
    final PersistentEntityStore entityStore = PersistentEntityStores.newInstance(xodusRoot + instance);
    try {
        entityStore.executeInTransaction(new StoreTransactionalExecutable() {
            @Override
            public void execute(@NotNull final StoreTransaction txn) {
                final EntityIterable allUsers = txn.getAll(storeName);
                // TODO: How to skip/limit with 100k to millions of records, efficiently
                for (Entity userEntity : allUsers) {
                    User user = new User();
                    user.setEntityId((String) userEntity.getId().toString());
                    user.setUsername((String) userEntity.getProperty("username"));
                    users.add(user);
                }
            }
        });
    } finally {
        entityStore.close();
    }
    return users;
}

标签: javaxodus

解决方案


只需评估就足够了txn.getAll(storeName).skip(skip).take(limit)。您将获得一个EntityIterable( Iterable<Entity) 实例,然后您可以将其转换为一组用户。


推荐阅读