1

我有一个带有简单 ID 作为 URL 参数的页面。我现在要做的是运行一个查询来返回一些基本上需要迭代的关联实体:我需要为 LEAGUE 游戏、CUP 游戏和 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>

这里的问题是你不能简单地#{rosterScheduleQuery.setCustomRestriction(pa.group.round.subCompetition.competition.name)}在 c:forEach 中调用类似的东西,因为这个表达式只会被评估一次(如果我理解正确的话)。我可能在这里遗漏了要点,因为这都是程序性的。

您通常如何解决迭代和运行时参数化查询(附加 WHERE 条件)?最佳实践总是受欢迎的。

谢谢

编辑:我已经在使用 Facelets,但是 rich:tabPanel 需要使用 JSTL c:forEach。见http://relation.to/11633.lace

4

2 回答 2

0

JBossEL 允许带参数的方法调用,因此您可以添加一个中间 bean,该 bean 具有一个采用类型并检索结果的方法。基本上用“#{someNewBean.getResults(pa)}”替换“#{rosterScheduleQuery.resultList}”。该 bean 会将查询注入其中,它可以根据需要对其进行参数化。可能不像你想的那么优雅,但我认为这就是我的做法。

于 2011-06-28T00:26:01.943 回答
0

混合 JSP 和 JSF 处理程序并不是一个好主意。您正在使用switchType equal To client这意味着它的内容将被预先呈现给客户端,并且在切换期间不会发生与服务器的交互。

好吧,这不是最好的解决方案,但我认为它可以帮助你

<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;
    }

}
于 2011-07-01T14:14:22.177 回答