向存储过程/ SQL提供可变数量的参数

时间:2011-05-18 16:03:32

标签: java sql database hibernate

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

在前端,我可以尽可能少地过滤 - 向我展示所有蓝色车辆,向我展示所有带4门的红色车辆,向我显示所有车辆的标识号为XXX123或ipod功能和五个扬声器立体声。等

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

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

  • WHERE doors = 4
  • WHERE doors = 5 AND color = RED AND MP3 = Y
  • WHERE turbo = Y OR blown = Y

你明白了。

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

- 干杯,戴夫

2 个答案:

答案 0 :(得分:0)

您可以动态构建查询但仍然有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)

答案 1 :(得分:0)

我可以想到一种作弊方式,虽然我想/希望查询会被优化。您可以在准备好的语句中为要添加的条件添加额外的args,只有在该字段存在时才会评估为true。

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