JSF - Как использовать значения строки базы данных для генерации дополнительных столбцов в datatable - PullRequest
0 голосов
/ 19 января 2011

У меня проблема, которая должна быть легкой, но у меня проблемы с поиском решения. У меня есть база данных, которую я хочу представить в виде данных. Однако мне нужны дополнительные столбцы, которые получают больше информации о текущей строке. Например - в базе данных есть набор людей с идентификационными номерами. Мне нужно отобразить имя, фамилию, идентификатор (все столбцы базы данных), но затем я хочу отобразить адрес, который находится в другом веб-сервисе REST, и для его получения мне нужно отправить идентификатор (из базы данных). Я надеюсь, что я описал это ясно, но на всякий случай я укажу:

моя база данных имеет 3 столбца: имя, имя las, номер идентификатора -Мне нужно добавить 4-й столбец в моей таблицы данных с адресом -для получения адреса мне нужно отправить идентификационный номер на остальную веб-службу

Единственное решение, которое мне удалось найти, - добавить все элементы базы данных в список или какой-либо контейнер, а затем использовать его внутри компонента. Но это недопустимо, так как база данных очень большая. Должен быть более простой способ, но кажется, что я не могу сформировать адекватный вопрос для Google, чтобы получить правильные результаты:> Кто-нибудь может дать какой-нибудь совет?

1 Ответ

1 голос
/ 19 января 2011

Итак, что вы в основном хотите - это выполнить соединение между результатом запроса к базе данных и веб-сервисом.

Конечно, вам не нужно загружать всю БД в каком-либо бине, чтобы выполнить это «соединение», просто загрузите данные, которые вы хотели бы отобразить на экране, в вспомогательном бине, загрузите адреса для каждой строки и связывайте результат к датируемому.

Примерно так:

@ManagedBean
@ViewScoped
public class MyBean {

    @EJB
    private someDataService;

    @EJB
    private someWebService;

    List<Person> persons;
    Map<Long, String> addresses;

    @PostConstruct
    public void retrieveData() {
        persons = someDataService.getByID(someID);
        for (Person person : persons) {
            addresses.put(person.getID(), someWebService.getByID(person.getID));
        }
    }

    // getters here
}

И Facelet:

<h:dataTable value="#{myBean.persons}" var="person">
    <h:column>
        #{person.name}
    </h:column>
    <h:column>
        #{person.lastName}
    </h:column>
    <h:column>
        #{myBean.addresses[person.ID]}      
    </h:column>             
</h:dataTable>

Есть несколько вариантов выбора. Вы также можете выполнить соединение внутри одного сервиса и вернуть ему некоторый тип, который включает адрес. Вы также можете сделать обертку или декоратор.

Было бы также более эффективно, если бы веб-служба могла обрабатывать список идентификаторов, а не требовать отдельного вызова для каждого извлекаемого адреса. Вы также можете захотеть заняться локальным кэшированием и т. Д., Но эти детали зависят от вас;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...