按实体中未包含的列对数据表进行排序/过滤

Can*_*ris 4 java primefaces

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

...
<p:column headerText="total">
    <h:outputText value="#{bean.total}" />
</p:column>
...
Run Code Online (Sandbox Code Playgroud)

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

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

Min*_*win 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

JSF:

<p:column headerText="total">
    <h:outputText value="#{subClass.total}" />
</p:column>
Run Code Online (Sandbox Code Playgroud)

2)使用rowIndexVar(/sf/answers/399286121/)并在Managed Bean上调用传递rowIndexVaras参数的方法.然后获取相应的实体并进行数学运算.需要EL 2.2.

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

托管bean:

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

3)如果具有相同问题的人编辑实体没有问题,您可以将getTotal()方法添加为@Transient:

    @Transient
    public int getTotal() {
        int iDidMathOnEntityData = 0;
        // do math
        return iDidMathOnEntityData;
    }
Run Code Online (Sandbox Code Playgroud)