如何迭代和动态参数JPQL查询?

时间:2011-06-24 14:16:49

标签: jsf seam iteration el parameterized-query

我有一个简单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

2 个答案:

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

}