1 回答
TA贡献1840条经验 获得超5个赞
好的,我终于做到了,每次 load() 方法被触发时我都应该执行查询的想法是正确的。
我面临的问题:
如果我只返回查询的结果 - load() 方法只触发一次,并且我无法加载更多数据。所以我使用虚拟sublist(0, chunkSize)。
我不能@Autowire 我的存储库,我有一个例外,说某些对象未序列化。但是我可以使用 EntityManager而这就是我所做的。
源代码:
private List<MyEntity> datasource; // contains only ids
@Override
public List<MyEntity> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,Object> filters) {
StringBuilder queryText = new StringBuilder("select ...");
List<MyEntity> list;
//paginate
if(datasource.size() > pageSize) {
try {
list = new ArrayList<>(datasource.subList(first, first + pageSize));
}
catch(IndexOutOfBoundsException e) {
list = new ArrayList<>(datasource.subList(first, first + (datasource.size() % pageSize)));
}
}
else {
list = new ArrayList<>(datasource);
}
boolean setComa = false;
for (MyEntity a: list) {
if (setComa) {
queryText.append(","+a.getId());
} else {
queryText.append(a.getId());
setComa = true;
}
}
queryText.append(")");
Query q = em.createQuery(queryText.toString());
list = q.getResultList();
return list.subList(0, list.size());
}
更新限制:
@Override
public List<MyEntity> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,Object> filters) {
List<MyEntity> list;
Query q = em.createQuery(this.queryText);
// Paginate
q.setFirstResult(first);
q.setMaxResults(pageSize);
list = query.getResultList();
return list.subList(0,list.size());
}
添加回答
举报