4

我有一个数据表,其中包含在我的实体中定义的列。我还添加了另一个名为totalindex.xhtml 的列:

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

此列计算并返回每行中列的总和。一切正常,除了当我想按列排序/过滤时,该total列保持不变。

我想我也应该total在我的实体中添加该字段,但这似乎不切实际。对于这种情况,primefaces 有更好更直接的解决方案吗?

4

1 回答 1

5

由于您希望实体类保持不可变,因此我可以考虑两种解决方案:

1)创建实体的子类,但不要将其声明为实体。您还可以创建一个包装类,接收Entity作为构造函数参数,并通过 getter 和 setter 直接操作原始对象上的数据。子类化的优点是已经继承了公共方法,但缺点是必须关心数据。

检查此答案,了解为什么不将实体子类化为实体以及持久性问题。

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/1532705rowIndexVar ) 并在传递as 参数的托管 Bean 上调用方法。然后获取相应的实体并进行数学运算。需要 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)如果有相同问题的人编辑实体没有问题,您可以将getTotal()方法添加为@Transient

    @Transient
    public int getTotal() {
        int iDidMathOnEntityData = 0;
        // do math
        return iDidMathOnEntityData;
    }
于 2013-04-17T14:50:55.897 回答