2

我一直在 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 表的 Leave 表中。

我有一个搜索容器,仅当休假待处理时才显示休假表中的数据我只想显示员工表中与休假表匹配并满足上述条件的字段。

4

2 回答 2

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. 否则,如果您不想更改TestAppImplJSP 中的 then ,您可以使用:

    <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() %>
    
    <%
    }
    %>
    

希望这是您正在寻找的东西,或者至少它可能会给您一个前进的提示。

于 2013-04-24T07:24:55.577 回答
2

您的问题有两个方面:

  1. 能够通过使用employeeId 外键从表Leave 和Employee 中检索数据。您不需要自定义查询,这是一项非常简单的任务,我只是指出来。
  2. 在搜索容器中显示无法从一个数据/表中检索到的数据。如您所见,名为“className”的“liferay-ui:search-container-row”属性可以取一个类名的值。关于这一点,我可以看到两种方法:

a) 检索每个 Leave 表的结果,并按员工 ID 和待处理状态过滤掉。然后在每一行中,使用employeeId 再次取回Employee 实例(通过EmployeeLocalServiceUtil.getEmployee(empId)),然后获取Employye 属性,如员工姓名等。这将需要您亲自处理jsp 文件

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

于 2013-04-29T07:18:55.340 回答