java - 如何从 `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;
}
解决方案
只需评估就足够了txn.getAll(storeName).skip(skip).take(limit)
。您将获得一个EntityIterable
( Iterable<Entity
) 实例,然后您可以将其转换为一组用户。
推荐阅读
- python - 如果我不知道要添加多少变量,如何向类添加更多变量(python)
- c++ - 嵌入式 C++ 运行时多态性的最佳实践?ROMable 运行时多态性?
- sql - 如何使用通配符匹配两个相同的列值
- java - 为什么Java没有正确计算逻辑移位?
- r - 总结:使用来自不同向量的值的新列
- python - NameError,名称未定义
- ios - 元数据已还原,我不明白为什么
- networking - Dart:如何解析主机名
- python - Python KeyError:对于 flow_from_dataframe 中的 x_col 值,用于引用现有列
- schema.org - Schema.org 产品列表与单个产品页面