Виждам, че name , title , status и remarks всички полета са String (според вашия коментар
), така че в for цикъл трябва да изпълните Object като String и нямате нужда от четирите ArrayList за това.
Ето как ще изглежда етикетът на реда:
<liferay-ui:search-container-row className="java.lang.Object" modelVar="search">
<%--
Since an "Object[]" is nothing but an "Object", we first cast the "search"
instance to an "Object[]" and then to a "String"
--%>
<liferay-ui:search-container-column-text name='name' value='<%= (String) ((Object[])search)[0] %>' />
<liferay-ui:search-container-column-text name='title' value='<%= (String) ((Object[])search)[1] %>' />
<liferay-ui:search-container-column-text name='status' value='<%= (String) ((Object[])search)[2] %>' />
<liferay-ui:search-container-column-text name='remarks' value='<%= (String) ((Object[])search)[3] %>' />
</liferay-ui:search-container-row>
Ето, това трябва да работи.
Мисля, че по-чист начин би бил дефинирането на POJO, което да съхранява тези стойности и след това списъкът на POJO може да бъде върнат. Все пак не съм пробвал втория подход.
Друг стандартен подход е да се включат допълнителни полета във всяко едно от *Impl на обекта и след това връщане на списъка на този обект, във вашия случай бих предположил, че имате Student и Attendance обекти, така че можете да поставите полетата status &remarks в StudentImpl и след това върне List<Student> или поставете fname в AttendanceImpl и върне List<Attendance> от метода на намиращия. (актуализирано след този коментар
)