Как перебирать и динамически параметризировать JPQL-запросы? - PullRequest
1 голос
/ 24 июня 2011

У меня есть страница с простым идентификатором в качестве параметра URL.Теперь я выполняю запрос, чтобы вернуть количество связанных сущностей, которые в основном необходимо перебрать: мне нужно расписание игр, которое нужно вернуть для игр LEAGUE, CUP и PLAYOFFS, поэтому списки результатов должны отличаться в зависимости отитерация.

Каждое из этих расписаний получает свою вкладку в графическом интерфейсе.Мне уже нужен JSTL c: forEach для вкладок 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>

Проблема в том, что вы не можете просто вызвать что-то вроде #{rosterScheduleQuery.setCustomRestriction(pa.group.round.subCompetition.competition.name)} в c: forEach, так как это выражение будет оцениваться только один раз (если я правильно понимаю).Я мог бы здесь упустить общий смысл, поскольку все это довольно процедурно.

Как вы обычно решаете итеративные и параметризованные запросы во время выполнения (дополнительные условия WHERE)?Всегда приветствуются лучшие практики.

Спасибо

Редактировать: Я уже использую Facelets, но rich: tabPanel требует использования JSTL c: forEach.См http://relation.to/11633.lace.

Ответы [ 2 ]

0 голосов
/ 01 июля 2011

Не рекомендуется смешивать обработчики JSP и JSF.Вы используете switchType , равный client , что означает, что его содержимое будет передано клиенту, и при переключении взаимодействие с сервером не произойдет

Ну, это не может быть лучшим решением, но я думаю, что оно может помочь вам

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

}
0 голосов
/ 28 июня 2011

JBossEL позволяет вызывать методы с параметрами, поэтому вы можете добавить промежуточный компонент, имеющий метод, который принимает тип и получает результаты.В основном замените "# {rosterScheduleQuery.resultList}" на "# {someNewBean.getResults (pa)}".В этот боб будет вставлен запрос, который он может параметризировать по мере необходимости.Возможно, не так элегантно, как хотелось бы, но я думаю, что именно так я и сделаю.

...