我有一个简单ID的页面作为URL参数。我现在做的是运行查询以返回一些基本上需要迭代的关联实体:我需要为LEAGUE游戏,CUP游戏和PLAYOFFS游戏返回游戏时间表,因此结果列表必须不同迭代。
这些计划中的每一个都在GUI中有自己的选项卡。我已经需要JSTL c:forEach for RichFaces选项卡,所以我“只”需要找到一种方法来为组件设置另一个WHERE限制(这里是一个Seam EntityQuery子类实例)。
这里的问题是:如何在迭代期间使用当前实体参数化每个查询?如何在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了,但是很丰富:tabPanel需要使用JSTL c:forEach。请参阅http://relation.to/11633.lace。
答案 0 :(得分:0)
JBossEL允许使用参数进行方法调用,因此您可以添加一个中间bean,该中间bean具有获取类型并检索结果的方法。基本上用“#{someNewBean.getResults(pa)}”替换“#{rosterScheduleQuery.resultList}”。这个bean会向其中注入查询,可以根据需要进行参数化。可能没有你想要的那么优雅,但我认为这就是我要做的事情。
答案 1 :(得分:0)
混合使用JSP和JSF处理程序并不是一个好主意。您正在使用 switchType 等于客户端,这意味着其内容将预呈现给客户端,并且在切换期间不会与服务器进行任何交互。
嗯,它不是最好的解决方案,但我认为它可以帮助你
<rich:tabPanel value="#{participationTabPanel}">
</rich:tabPanel>
你管理的bean
@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;
}
}