【问题标题】:Supplying variable number of arguments to a stored procedure / SQL为存储过程/ SQL 提供可变数量的参数
【发布时间】:2011-05-18 16:03:31
【问题描述】:

我有一些数据库表,比如说 CarTb,还有一个前端可以让您浏览可供出售的二手车。

在前端,我可以根据需要过滤尽可能少或尽可能多的内容 - 显示所有蓝色汽车,显示所有带 4 门的红色汽车,显示所有具有 rego 编号 XXX123 或 ipod 功能和五个扬声器的汽车立体声。等等

我希望能够在 Java 后端做的是构建一个系统,该系统根据 UI 发送给我的内容动态查询数据库。我想知道是否可以将一整串参数动态注入到存储过程中......显然我知道你可以映射单个参数,如门=?和颜色=?然后用值替换...但是变量争论呢,就像我想的 Java vargs 一样。

你总是从 CarTb 中选择 *,它只是 where 子句可以是以下任何一个......

  • WHERE 门=4
  • 其中门=5,颜色=红色,MP3=Y
  • 涡轮=Y 或吹=Y

你明白了。

有什么建议吗?如果有帮助,我们确实可以访问 hibernate,以及 sybase 数据库(即,如果需要,我们可以编写另一个存储过程来执行此操作)。

--干杯,戴夫

【问题讨论】:

  • 您是否有权访问数据库(例如,您是否可以编写存储过程),或者您是否仅限于使用 Java?
  • 是的...我已经编辑了原始问题以反映这一点。

标签: java sql database hibernate


【解决方案1】:

您可以动态构建查询,但仍然有doors=:param。例如:

if (doorsSelected) {
    clauses.add("doors=:doors");
    paramNames.add("doors");
    values.add(doors);
}

if (engineSelected) {
    clauses.add("engine=:engine");
    params.put("engine", engine);
}

然后简单地加入子句列表(例如,使用 guava 的 Joiner):

String queryString = Joiner.on(" AND ").join(clauses);
Query query = session.createQuery(queryString);

然后迭代paramsquery.setParameter(key, value)

【讨论】:

  • 嗯...似乎是个好主意。既然我们可以有各种各样的选项(即不仅仅是 AND),我们是否不需要进行某种自定义解析来根据需要确定在哪里放置 AND、OR、NOT 等?
  • 好吧,如果你愿意,你可以加入他们的StringBuilder。或者为 andClauses、orClauses 等设置单独的列表。
【解决方案2】:

我可以想到一种作弊方式,尽管我想/希望查询会得到优化。您可以在准备好的语句中为您想要添加的条件添加额外的参数,这些条件只有在该字段存在时才会评估为真。

select ... 
  from ...
    where var1=? and <expression associated with that var1>  
    or var2=? and <expression associated with that var2>  
    or etc

【讨论】:

    猜你喜欢
    • 2011-09-04
    • 1970-01-01
    • 2010-11-02
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多