2013-04-23 3 views
2

Я использовал контейнер поиска в liferay для отображения данных из таблицы. Работает хорошо!! вот фрагмент кода:Показать данные в Liferay Search Container из разных таблиц базы данных: Liferay

<% 
List<testapp> pendingApprovals = ActionClass.getPendingLeaveApplications(); 
%> 
<liferay-ui:search-container delta="20" emptyResultsMessage="No Results Found"> 
    <liferay-ui:search-container-results total="<%= pendingApprovals.size() %>" 
     results="<%= ListUtil.subList(pendingApprovals , searchContainer.getStart(), searchContainer.getEnd()) %>" /> 

    <liferay-ui:search-container-row keyProperty = "empId" modelVar="search" 
     className="com.test.mis.portal.model.testapp"> 
     <liferay-ui:search-container-column-text name='Leave Duration' value = '<%=String.valueOf(search.getLeaveDuration())%>' href="" /> 
    </liferay-ui:search-container-row> 

    <liferay-ui:search-iterator/> 
</liferay-ui:search-container> 

Используя приведенный выше код, который я отображать данные из таблицы TestApp на основе некоторого условия. В том же коде я хотел бы добавить строку и отобразить данные. Данные для этой строки должны поступать из другой таблицы. Короче говоря, я хочу отображать данные с помощью контейнера поиска из двух разных таблиц базы данных. Можно ли? Мое требование таково, что данные поступают из двух разных таблиц.

ИЗОБРАЖЕННАЯ ЧАСТЬ С ТРЕБОВАНИЕМ У меня есть таблица сотрудников с некоторыми полями У меня есть другая таблица. Оставьте с полями. empId находится в таблице «Оставить», который отображается в таблице Employee.

У меня есть контейнер поиска whicg отображает данные из таблицы «Оставить» только в том случае, если отложенный запрос находится в ожидании Я хочу отображать только те поля из таблицы Employee, которые соответствуют таблице «Оставить» и удовлетворяют вышеуказанному условию.

+0

. Существует ли какая-либо связь между объектами testApp и другой таблицей. как внешний ключ? будет ли ровно один соответствующий экземпляр «другой таблицы» на строку или больше? Используете ли вы Service Builder для базы данных? Ваш вопрос очень расплывчатый и трудно ответить, пожалуйста, постарайтесь сделать вещи более ясными. – yannicuLar

+0

@yannicuLar: Да У меня есть внешний ключ. Прошу прощения, поскольку я не упоминал много в моем вопросе. У меня есть FK. testApp имеет testAppId, а «otherTable» имеет testAppId, который ссылается на таблицу testApp. Я использовал Service Builder. Я хочу отображать только те записи данных, в которых встречается FK. Я думаю, что это может быть невозможно, поскольку в контейнере поиска мы упоминаем объект в имени класса. Но просветите меня, если есть способ. Один из способов - использование пользовательского запроса, о котором я не знаю. –

+0

Просто пояснение: вам нужно отображать в каждой строке данные, которые извлекаются из 2 сущностей? – yannicuLar

ответ

2

Ваша проблема здесь имеет 2 лица:

  1. Будучи в состоянии восстановить данные из таблиц и ВЫХОДА Employee, используя EmployeeID внешнего ключа. Для этого вам не нужен специальный запрос, и это довольно тривиальная задача, я просто указываю на это.
  2. Отображение в контейнере поиска данных, которые невозможно извлечь из одной таблицы данных/таблицы. Как вы можете видеть, атрибут «liferay-ui: search-container-row» с именем «className», который принимает значение одного имени класса.Об этом, я вижу два подхода:

a) Извлеките результаты в таблицу «Оставить» и отфильтруйте идентификатор сотрудника и состояние ожидания. Затем в каждой строке используйте employeeId, чтобы снова вернуть экземпляр Employee (по EmployeeLocalServiceUtil. GetEmployee (empId)), затем получить атрибуты Employye, такие как имя сотрудника и т. Д. Это должно быть грязным в файле jsp.

b) Создайте собственный класс (например, EmployeePendingLeaves) и используйте его в качестве класса модели searchContainer. Не включайте его в свою модель базы данных. Просто создайте функцию, которая сканирует таблицы Employee и Leave и создает экземпляр EmployeePendingLeaves для каждой строки результатов. он должен иметь переменную/атрибут для каждого столбца строки.

. .
+0

Я применил первый предложенный вами подход. Спасибо yannicuLar, это сработало! Но из любопытства я также хотел бы узнать о втором подходе. Во втором подходе вы предложили мне использовать пользовательский класс в качестве класса модели searchContainer. Поэтому из того, что я понял, следует написать функцию EmployeePendingLeaves в моем классе действий и включить ее в классName .. Правильно ли это? Btw У меня есть ответ на ваш ответ и принят тоже :) –

+0

Нет. В моем примере EmployeePendingLeaves - это класс, а не функция. Просто класс с 3 переменными, по одному для столбца каждой строки. В своем классе действий вы просто создадите эти объекты и вернете их в jsp. Это можно сделать в функции, которая сканирует db для записей Employee и Leave и создает один экземпляр EmployeePendingLeaves для каждого результата/строки. Затем возвращает массив с этими экземплярами – yannicuLar

+0

@ yannicuLar: Спасибо, я попробую это как упражнение. Тем временем вы могли бы помочь мне с http://stackoverflow.com/questions/16229369/get-images-from-liferay-document-library-whose-id-is-stored-in-separate-databse?noredirect=1# comment23567377_16229369 Я хочу вашу помощь в разделе EDITED. –

2

Там может быть много способов, здесь я перечислю некоторые, которые приходят на ум готовности:

  1. один способ заключается в изменение модели TestAppImpl генерируемой через ServiceBuilder включить ваше что-то зависимость, как это:

    public class TestAppImpl extends TestAppBaseImpl { 
    
        private List<OtherTableData> otherTableDataList; 
    
        private OtherTableData otherTableData; 
    
        // if want to retrieve a list of rows 
        public List<OtherTableData> getOtherTableDataList() { 
    
         // call a custom method created in the OtherTableDataLocalService 
         // testAppId variable is available to TestAppImpl 
         List<OtherTableData> otherDataList = OtherTableDataLocalServiceUtil.getOtherDataListByTestAppId(testAppId); 
    
         return otherDataList; 
        } 
    
        // if want to retrieve just one row 
        public OtherTableData getOtherTableData() { 
    
         // call a custom method created in the OtherTableDataLocalService 
         // testAppId variable is available to TestAppImpl 
         OtherTableData otherData = OtherTableDataLocalServiceUtil.getOtherDataByTestAppId(testAppId); 
    
         return otherData; 
        } 
    } 
    

    Вам необходимо будет восстановить свое обслуживание после вышеуказанного изменения.

    Теперь в JSP вы можете просто использовать:

    <liferay-ui:search-container-column-text name='Other table data name' value='<%=search.getOtherTableData().getName() %>' href="" /> 
    
  2. или иначе, если вы не хотите, чтобы изменить TestAppImpl то в JSP вы можете использовать:

    <liferay-ui:search-container-column-text> 
    
    <% 
    List<OtherTableData> otherDataList = OtherTableDataLocalServiceUtil.getOtherDataListByTestAppId(search.getTestAppId()); 
    
    for (OtherTableData tempData : otherDataList) { 
    %> 
    
        <%=tempData.getName() %> 
        <%=tempData.getDescription() %> 
        <%=tempData.getData() %> 
    
    <% 
    } 
    %> 
    
    </liferay-ui:search-container-column-text> 
    
  3. изменение точки-2 выше:

    <liferay-ui:search-container-column-jsp 
        name="otherDataFetch" 
        path="/html/portlet/testApp/other_data.jsp" 
    /> 
    

    А в other_data.jsp мы можем иметь следующий код:

    <% 
    ResultRow row = (ResultRow)request.getAttribute(WebKeys.SEARCH_CONTAINER_RESULT_ROW); 
    
    TestApp search = (TestApp) row.getObject(); 
    
    List<OtherTableData> otherDataList = OtherTableDataLocalServiceUtil.getOtherDataListByTestAppId(search.getTestAppId()); 
    
    for (OtherTableData tempData : otherDataList) { 
    %> 
    
        <%=tempData.getName() %> 
        <%=tempData.getDescription() %> 
        <%=tempData.getData() %> 
    
    <% 
    } 
    %> 
    

Надежда это то, что вы искали, или же по крайней мере он может дать вам подсказку идти вперед.

+0

Спасибо за объяснение. Я постараюсь реализовать и сообщить вам в течение часа :) Пожалуйста, следуйте за этим сообщением –

+0

Он не работает. Может быть, я должен записать свой запрос более подробно. Проверьте отредактированную часть в моем вопросе. РАЗРАБОТАННЫЙ РАЗДЕЛ С ТРЕБОВАНИЕМ –

+0

Можете ли вы рассказать мне конкретно, что не работает? Требование просто повторяет то, что вы уже написали, вы только что дали имя двух таблиц «testapp = leaves» и «otherDataTable == Employee». Также в разделе «ИЗМЕНИТЬ СЕКЦИЯ С ТРЕБОВАНИЕМ» по «полям» вы имеете в виду «строки» данных или столбцов в этой таблице? Также я предполагаю, что 'Employee' и' Leave' являются отдельными объектами модели. –