Java 如何操作jrxml模板中指定的SQL

Java 如何操作jrxml模板中指定的SQL,java,jasper-reports,ireport,Java,Jasper Reports,Ireport,问题:报表模板是由管理员用户创建的,他们只决定在哪里显示哪些数据,因为业务用户指定了数据的筛选器。在更简单的SQL术语中,查询由管理员用户指定,业务用户指定WHERE子句 Jasper允许用户在SQL查询中指定参数,如$p{city}。我尝试使用中指定的方法动态检索查询 可能的解决办法是 在JRXML中使用WHERE子句参数,并在创建报表时替换它们-这将节省我进行SQL解析的时间,但我不想用这种复杂性来指导管理员用户。解析不是一个大问题 使用我的自定义jdbc查询执行器和工厂,只允许在jaspe

问题:报表模板是由管理员用户创建的,他们只决定在哪里显示哪些数据,因为业务用户指定了数据的筛选器。在更简单的SQL术语中,查询由管理员用户指定,业务用户指定WHERE子句

Jasper允许用户在SQL查询中指定参数,如$p{city}。我尝试使用中指定的方法动态检索查询

可能的解决办法是

  • 在JRXML中使用WHERE子句参数,并在创建报表时替换它们-这将节省我进行SQL解析的时间,但我不想用这种复杂性来指导管理员用户。解析不是一个大问题
  • 使用我的自定义jdbc查询执行器和工厂,只允许在jasper fire SQL查询之前创建扩展点。我将完全依赖vanilla Jasper JDBC数据源,但只在执行之前修改查询。JR AbstractQueryExecuter简化了查询,并在启动查询之前替换了jasper相关的令牌-这将非常脏,并将迫使我特定于实现
  • 在我的应用程序代码库中执行与JRactAbstractQueryExecuter相同的替换,解析SQL查询,修改它,然后按照中的指定再次设置它
  • 你能建议一个更好的方法吗?我有一种感觉,这完全可以用更干净的方式来完成


    感谢您的帮助

    您可以创建一个输入控件来确定所需的WHERE子句,并使用一个参数来保存WHERE子句的内容。默认值表达式类似于:

     $P{theParameter} == "value_1" ?
         (" AND CONDITION_1 IN ('A', 'B', 'C') AND CONDITION_2 = 'Yes' "
         ) : " AND CONDITION_3 = 'Other' AND CONDITION_4 = 'No' "
    
    然后在WHERE子句中,您将引用如下内容:

     WHERE
          .... = .....
          AND .... = ....
          AND .... = ....
          $P!{theParameter}
    
    如果WHERE子句中的约束列相同,则可以使用$p!要逐字输入参数值并在查询中引用它,请执行以下操作:

     WHERE
          .... = .....
          AND .... = ....
          AND .... = ....
          AND thisValue = $P!{theParameter}
    

    您正在寻找一种动态创建WHERE子句的方法吗?在最后一个示例中,这假设您的参数仅约束一个变量,例如,thisValue=$P!{theParameter}::和thisValue='sampleInput'