2013-04-17 2 views
3

У меня есть datatable, который имеет столбцы, определенные в моей сущности. Я также добавил еще один столбец с именем total в index.xhtml:Сортировка/фильтрация данных по столбцу, который не включен в объект

... 
<p:column headerText="total"> 
    <h:outputText value="#{bean.total}" /> 
</p:column> 
... 

Эта колонка вычисляет и возвращает сумму столбцов в каждой строке. Все работает отлично, за исключением случаев, когда я хочу сортировать/фильтровать по столбцам, столбец total остается нетронутым.

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

+0

Добавление его в вашу сущность звучит тривиально: почему вы говорите непрактично? – Romski

+0

@Romski Представьте, что я использую эту сущность на многих страницах. в дополнение к полю _total_, у меня будет 5 или 6 полей, которые относятся к одной странице, еще 3 поля, которые относятся к другой странице и так далее. все эти поля могут быть вычислены из полей объектов. так что еще практично добавить все эти поля в объект? Я так не думаю. –

+0

Можете ли вы опубликовать несколько снимков экрана? –

ответ

4

Так как вы хотите класс сущности оставаться неизменным, я могу думать о двух решений вопроса:

1) Создайте подкласс вашей организации, но не объявим его как единое целое. Вы также можете создать класс-оболочку, принимающий Entity в качестве параметра конструктора, и непосредственно манипулировать данными об исходном объекте с помощью геттеров и сеттеров. Преимущество подклассификации состоит в том, что наследуют общедоступные методы, но недостатком является необходимость ухода за данными.

Отметьте this answer, почему бы не подклассифицировать сущность как сущность и проблемы с устойчивостью.

public class EntitySubclass extends Entity { 

    private Entity parent; 

    public EntitySubclass(Entity parent) { 
     this.parent = parent; 
     // set all data from parent to this entity. 
    } 

    // fetch the parent object for persistance. 
    public Entity getParent() { 
     // set all data from this to parent. 
    } 

    public int getTotal() { 
     int iDidMathOnEntityData = 0; 
     // do math 
     return iDidMathOnEntityData; 
    } 

} 

JSF:

<p:column headerText="total"> 
    <h:outputText value="#{subClass.total}" /> 
</p:column> 

2) С помощью rowIndexVar (https://stackoverflow.com/a/5704087/1532705) и вызвать метод управляемого компонента прохождения rowIndexVar в качестве параметра. Затем выберите соответствующий объект и выполните математику. Requires EL 2.2.

<p:column headerText="total"> 
    <h:outputText value="#{bean.total(rowIndexVar)}" /> 
</p:column> 

управляемый компонент:

public int total(int rowIndexVar) { 
    int iDidMathOnEntityData = 0; 
    Entity e = getEntityByIndex(rowIndexVar); 
    // do some math 
    return iDidMathOnEntityData; 
} 

3) если кто-то с той же проблемой не имеет никаких проблем с editting объект, вы можете добавить getTotal() метод, как @Transient в:

@Transient 
    public int getTotal() { 
     int iDidMathOnEntityData = 0; 
     // do math 
     return iDidMathOnEntityData; 
    } 
Смежные вопросы