我需要使用Freemarker中的实体列表迭代器迭代大量记录。但是,在使用递归宏时,只有达到1000条记录时才会出现StackOverflow错误。以下是相同的代码段。
<#macro recurseTest value>
${value.partyId!}
${value.firstName!}
${value.lastName!}
<#local tmp = eli.next()!/>
<#if tmp?has_content>
<@recurseTest tmp/>
</#if>
</#macro>
<#assign eli = EntityQuery.use(delegator).from("Person").queryIterator()/>
<br>
<@recurseTest eli.next()!/>
${eli.close()}
答案 0 :(得分:0)
无论使用FreeMarker,使用递归处理1000个元素都不是正常做法(除了在一些没有通常的循环构造但具有尾递归优化的函数式语言中)。尝试使用#list
。如果您无法从该查询API获得List
或Iterator
(但如果可以,请查看),作为最后的手段,您可以执行此操作(穷人&#39; s do { ... } while (cond)
):
<#list 1..100000000 as _>
...
<#if !tmp?has_content><#break></#if>
</#list>
(有足够incompatible_improvements
的FreeMarker配置设置你可以写<#list 1.. as _>
,但我不知道它设置的是什么。所以我指定了一些会导致任意高的数字无论如何,在实践中超时或内存不足。)