我一直在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表匹配的那些字段,并满足上述条件。
答案 0 :(得分:2)
可能有很多方法,在这里我列出了一些我很容易想到的:
一种方法是修改通过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="" />
或者,如果您不想更改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>
上述第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() %>
<%
}
%>
希望这是你正在寻找的东西,否则至少它可能会给你一个前进的暗示。
答案 1 :(得分:2)
你的问题有2个面孔:
a)检索每个离开表的结果,并按员工ID和待处理状态过滤掉。然后在每一行中,使用employeeId再次返回Employee实例(通过EmployeeLocalServiceUtil.getEmployee(empId)),然后获取Employye属性,如员工姓名等。这将需要在jsp文件上弄脏
b)创建一个自定义类(比如EmployeePendingLeaves),并将其用作searchContainer的模型类。不要将它包含在数据库模型中。只需创建一个扫描Employee和Leave表的函数,并为每个结果行创建一个EmployeePendingLeaves实例。它应该为每个行的列都有一个变量/属性