在Liferay Search Container中显示来自不同数据库表的数据:Liferay

时间:2013-04-23 14:01:11

标签: java database liferay liferay-6

我一直在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表的数据。 在相同的代码中,我想添加一行并显示数据。此行的数据应来自另一个表。简而言之,我想使用来自两个不同数据库表的搜索容器来显示数据。 有可能吗?我的要求是数据来自两个不同的表

需要修改的部分 我有一些字段的Employee表 我有另一张表离开一些领域。 empId位于Leave表中,映射到Employee表。

我有一个搜索容器whicg只有在休假待定时才显示离开表中的数据 我想只显示Employee表中与Leave表匹配的那些字段,并满足上述条件。

2 个答案:

答案 0 :(得分:2)

可能有很多方法,在这里我列出了一些我很容易想到的:

  1. 一种方法是修改通过ServiceBuilder生成的TestAppImpl模型,以包含您的依赖项:

    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() %>
    
    <%
    }
    %>
    
  4. 希望这是你正在寻找的东西,否则至少它可能会给你一个前进的暗示。

答案 1 :(得分:2)

你的问题有2个面孔:

  1. 能够通过使用employeeId外键从表Leave和Employee中检索数据。你不需要自定义查询,这是一个非常简单的任务,我只是指出来。
  2. 在搜索容器中显示无法从一个数据/表中检索的数据。正如您所看到的,名为“className”的'liferay-ui:search-container-row'属性可以获取一个类名的值。关于这一点,我可以看到两种方法:
  3. a)检索每个离开表的结果,并按员工ID和待处理状态过滤掉。然后在每一行中,使用employeeId再次返回Employee实例(通过EmployeeLocalServiceUtil.getEmployee(empId)),然后获取Employye属性,如员工姓名等。这将需要在jsp文件上弄脏

    b)创建一个自定义类(比如EmployeePendingLeaves),并将其用作searchContainer的模型类。不要将它包含在数据库模型中。只需创建一个扫描Employee和Leave表的函数,并为每个结果行创建一个EmployeePendingLeaves实例。它应该为每个行的列都有一个变量/属性