【问题标题】:Dynamically build SQL where clause based on presence of attributes in DTO根据 DTO 中属性的存在动态构建 SQL where 子句
【发布时间】:2021-03-23 15:42:01
【问题描述】:

我有一个屏幕,用户可以在其中根据一个或多个列搜索表格。我将用户想要过滤的列作为 DTO 传递到后端。

我正在构建一个 SQL 来通过检查 DTO 中是否存在这些字段来进行查询...

Object transactionSearch (TransactionSearchDTO dto ){

    StringBuilder transactionQuery = new StringBuilder()
    transactionQuery.append("SELECT id, delivery_date, order_date, customer_name FROM transaction where 1=1 ")

    if (dto.order_id) {
     transactionQuery.append("and order_id = ${dto.order_id}")
    }
    if (delivery_date) {
     transactionQuery.append("and order_id = ${delivery_date}")
    }
    if (customer_name) {
     transactionQuery.append("and order_id = ${customer_name}")
    }

}

我最终得到的是每列的大量 if 语句。

有没有办法在没有每个过滤器的 if 块的情况下实现这一点?

我发现了一些想法here,但我需要一个 Groovy 或 Java 解决方案。

【问题讨论】:

  • 您的示例是否需要调整为在所有三个if 测试中不使用order_id

标签: java sql groovy


【解决方案1】:

我建议使用 GString 而不是 StringBuilder 将参数正确传递给 groovy.sql.Sql

class DTO{
    int id
    String name
    Date created
}

def a = new DTO(id:123, created:new Date())

GString f(DTO a){
    GString q = GString.EMPTY + 'select ' + a.getProperties().collect{k,v-> k}.join(',')+' from T'
    
    a.getProperties().each{k,v->
        if(k!='class' && v!=null){
            q = q + ( q.getValueCount()==0 ? ' WHERE ' : ' AND ' )
            q = q + k + " = ${v}"
        }
    }
    
    return q
}

def s = f(a)

println s
println s.getValues()
println s.getStrings()

【讨论】:

    猜你喜欢
    • 2012-07-08
    • 2019-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多