我有一个以简单ID作为URL参数的页面。我现在所做的是运行一个查询来返回一些基本上需要迭代的相关实体:我需要为联赛、杯赛和PLAYOFFS比赛返回一个比赛时间表,所以每次迭代的结果列表必须不同。
这些时间表中的每一个都在GUI中有自己的选项卡。对于RichFaces选项卡,我已经需要JSTL c:forEach,所以我"只"需要找到一种方法来对组件(这里是Seam EntityQuery子类实例)设置另一个WHERE限制。
这里的问题是:在迭代过程中,如何用当前实体参数化每个查询?如何在Seam/JBoss EL中做到最好?在迭代过程中,如何在EntityQuery实例中获得另外一两个限制?
以下是我使用的JSF代码:
<rich:tabPanel>
<c:forEach items="#{participationListQuery.resultList}" var="pa">
<rich:tab label="#{...}" switchType="client">
<h:form>
<rich:dataTable id="schedule-scores"
value="#{rosterScheduleQuery.resultList}"
var="sgl"
width="100%"
rows="20">
...
</rich:dataTable>
</h:form>
</rich:tab>
</c:forEach>
</rich:tabPanel>
这里的问题是,你不能简单地在c:forEach中调用类似#{rosterScheduleQuery.setCustomRestriction(pa.group.round.subCompetition.competition.name)}
的东西,因为这个表达式只会被求值一次(如果我理解正确的话)。我可能忽略了这里的要点,因为这都是程序性的。
通常如何解决迭代和运行时参数化查询(附加WHERE条件)?最佳实践总是受欢迎的。
感谢
编辑:我已经在使用Facelets了,但是rich:tabPanel需要使用JSTL c:forEach。看见http://relation.to/11633.lace.
JBossEL允许使用参数进行方法调用,因此您可以添加一个中间bean,该bean具有接受类型并检索结果的方法。基本上将"#{rosterScheduleQuery.resultList}"替换为"#{someNewBean.getResults(pa)}"。这个bean会将查询注入其中,它可以根据需要对其进行参数化。可能没有你想要的那么优雅,但我想我会这样做。
混合JSP和JSF处理程序不是一个好主意。您使用的switchType等于客户端,这意味着其内容将被预先呈现给客户端,并且在切换期间不会与服务器发生交互。
嗯,这可能不是最好的解决方案,但我认为它可以帮助你
<rich:tabPanel value="#{participationTabPanel}">
</rich:tabPanel>
你管理了豆
@Name
public class ParticipationManagedForm {
private @In EntityQuery<Participation> participationListQuery;
@Factory(value="participationTabPanel", scope=ScopeType.EVENT)
public HtmlTabPanel getParticipationTabPanel() {
HtmlTabPanel panel = new HtmlTabPanel();
for(List<Participation> participationList: participationListQuery.getResultList()) {
HtmlTab htmlTab = new HtmlTab();
// Set up htmlTab right here
panel.getChildren().add(htmlTab);
}
return panel;
}
}