1 回答

TA貢獻(xiàn)1840條經(jīng)驗(yàn) 獲得超5個(gè)贊
好的,我終于做到了,每次 load() 方法被觸發(fā)時(shí)我都應(yīng)該執(zhí)行查詢(xún)的想法是正確的。
我面臨的問(wèn)題:
如果我只返回查詢(xún)的結(jié)果 - load() 方法只觸發(fā)一次,并且我無(wú)法加載更多數(shù)據(jù)。所以我使用虛擬sublist(0, chunkSize)。
我不能@Autowire 我的存儲(chǔ)庫(kù),我有一個(gè)例外,說(shuō)某些對(duì)象未序列化。但是我可以使用 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());
}
添加回答
舉報(bào)