Spring jdbcTemplate动态where子句

h5qlskok  于 2023-03-16  发布在  Spring
关注(0)|答案(5)|浏览(197)

是否可以通过Jdbc模板生成任意where条件SQL查询:
示例:
如果我传递1个参数的值(仅名称):按名称搜索

"select * from address where shopname = ?";

如果我通过2参数值(名称和城市)-搜索商店名称和城市:

"select * from address where shopname = ? and city = ?";

我有多个搜索字段。7个字段。如果用户输入任何组合。我有搜索只基于参数。如何动态传递参数到SQL。需要片段/示例如何实现这一点。

wvmv3b1j

wvmv3b1j1#

你需要的是某种标准构建API,Hibernate有。不幸的是,我不认为Spring的JdbcTemplate有任何这样的工具。如果我错了,其他人会纠正我...

gpnt7bae

gpnt7bae2#

虽然有些人已经建议Hibernate是最好的方法,但我仍然认为您可以尝试这种方法-

String sql = "select * from address where 1 = 1";

if(shopname != null)
  sql += "and shopname = :shopname";

if(city!= null)
  sql += "and city = :city";

等等..并使用命名参数JdbcTemplate

camsedfj

camsedfj3#

SpringData和Hibernate都有这样的功能,尽管在这么大的框架中为你的应用添加这些功能可能不值得。
您可以尝试 checkout SimpleJdbcInsert http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jdbc.html

  • 编辑:* 或者,您可以尝试在SQL中通过检查空来修复它,但如果您有大量数据要处理,这种技术会降低请求速度。
"select * from address 
where (shopname = ? or shopname = null)
 and (city = ? or city = null)";
slwdgvem

slwdgvem4#

如果您使用的是Kotlin,则可以如下构造查询:

fun optParamStr(param: Any?, queryParamName: String): String? =
        param?.let { "$queryParamName = :$queryParamName" }

val params = listOf(
                value1 to filed1,
                value2 to field2,
                value3 to field3
            ).mapNotNull { optParamStr(it.first, it.second) }.joinToString(" AND ")
72qzrwbm

72qzrwbm5#

如果您可以选择Scala,那么可以使用以下代码构造查询:

case class Search(shopname:String, city:String = None) {
 def sql = "select * from address where shopname = '"+shopname+"'" + city.map(" and city = '"+
      _ +"'").getOrElse("")  
}

示例用法:

Search("lloh").sql
Search("lloh", Some("Austin")).sql

相关问题