Spring jdbcTemplate动态where子句

问题描述 投票:0回答:5

是否可以通过Jdbc模板生成任意where条件SQL查询:

例子:

如果我为 1 个参数传递值(仅名称):按名称搜索

"select * from address where shopname = ?";

如果我传递 2 个参数(名称和城市)的值 - 按商店名称和城市搜索:

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

我有多个搜索字段。 7 个字段。如果用户输入任何组合。我只根据参数进行搜索。如何将参数动态传递给sql。需要片段/示例如何实现这一点。

spring jdbctemplate
5个回答
11
投票

你想要的是 Hibernate 拥有的某种标准构建 api。不幸的是,我认为 Spring 的 JdbcTemplate 没有任何这样的功能。如果我错了,其他人会纠正我......


3
投票

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

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

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

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

等等..并使用NamedParameterJdbcTemplate


0
投票

Spring Data 和 Hibernate 具有这种功能。虽然可能不值得为您的应用程序拖入这么大的框架。

你可以试试看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)";

0
投票

如果您使用的是 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 ")

-3
投票

如果 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
© www.soinside.com 2019 - 2024. All rights reserved.