【问题标题】:Sort/filter a datatable by a column which is not included in the entity按不包含在实体中的列对数据表进行排序/过滤
【发布时间】:2013-04-09 21:15:28
【问题描述】:

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

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

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

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

【问题讨论】:

  • 将它添加到您的实体听起来微不足道 - 为什么说不实用?
  • @Romski 想象我在很多页面中都使用了这个实体。除了 total 字段之外,我还有 5 或 6 个特定于一个页面的字段,另外 3 个特定于另一个页面的字段,依此类推。所有这些字段都可以从实体字段中计算出来。那么将所有这些字段添加到实体中是否可行?我不这么认为。
  • 你能发一些截图吗?
  • @CanisMajoris 你看到this了吗?也许更新表格列会有所帮助。
  • @CanisMajoris - 然后使用包装类。为您的实体创建一个包装类,并添加这些实用方法。但要小心“Voltron 实体”。如果出于多种原因在多个地方使用它,则可能实际上是将几个不同的实体绑定在一起。

标签: java primefaces


【解决方案1】:

由于您希望实体类保持不可变,我可以想到两种解决方案:

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

查看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) 并调用托管 Bean 上的方法,传递 rowIndexVar 作为参数。然后获取相应的实体并进行数学运算。 Requires EL 2.2.

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

托管 bean:

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;
    }

【讨论】:

    猜你喜欢
    • 2012-04-09
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 2021-10-31
    • 2015-12-12
    相关资源
    最近更新 更多