代码之家  ›  专栏  ›  技术社区  ›  NimChimpsky

我在反模式中,我想出去

  •  15
  • NimChimpsky  · 技术社区  · 14 年前

    我正在使用jsp/jquery/ejb/jboss开发一个javawebapp。

    我有一个web表单,允许用户从数据库中选择100个字段的任意组合(全部来自不同的不相关的表/对象)。这些字段然后通过Javaservlet输出到excel电子表格。执行的存储过程总是返回所有100个字段。

    一切都很好,但感觉不对。我想不出一种可行的方法,不引用100个布尔值(N+1次)来确定一个字段是否应该包含在输出的电子表格中。例如,当我说可行时,我的意思是我不想重写存储过程或创建100个不同的存储过程。

    4 回复  |  直到 14 年前
        1
  •  3
  •   pcjuzer    14 年前

    我们的解决方案是在类似的情况下创建一个动态传输对象。基本上,这是一个 Map 而不是一个有很多能手和二传手的POJO。

        2
  •  1
  •   Adrian    14 年前

    您不能在应用程序中动态生成selectsql字符串,然后执行该SQL语句,而不是为此使用存储过程。所以只需要引用一次布尔值,只返回所需的列。

        3
  •  0
  •   Steve B.    14 年前

    您可以通过以下方式消除手动字段枚举:

    • 在表单加载时,对于每个可用的电子表格字段,输出一个布尔控件。最好是预先添加某种前缀,这样就不会与表单上存在的任何其他字段发生冲突。

    • 在表单提交时,您将显示包含的任何带有前缀的字段。

        4
  •  0
  •   nojo    14 年前

    您必须评估这是否真的更好,但是您可以使用一种方法,使用位数组来存储是否要使用字段。每个字段都有一个对应于单个位的值:

    static final FIELD1 = 1;
    static final FIELD2 = 2;
    static final FIELD3 = 4;
    static final FIELD4 = 8;
    static final FIELD5 = 16;
    etc
    

    然后为每个字段应用一个简单的位掩码,以确定选择了哪些字段(有没有比逐字段更好的方法?):

    boolean field1Selected = sum & FIELD1;
    boolean field2Selected = sum & FIELD2;
    etc
    

    缺点:有100个字段,你说的是一个非常大的数字!可能需要使用2位数组。我也不相信这真的简化了你的问题,但也许确实如此。