2011-05-18 127 views
0

我有一些数据库表,比如说CarTb,以及可以让您浏览可供出售的二手车的前端。向存储过程提供可变数量的参数/ SQL

在前端,我可以尽可能少或尽可能多地过滤 - 向我展示所有蓝色汽车,向我展示带有4扇门的所有红色汽车,向我展示带有rego号码XXX123或iPod功能的所有汽车以及五个扬声器音响。等

我想在Java后端能够做的是建立一个系统,根据UI发送给我的数据动态地查询数据库。我想知道是否有可能动态地将一串参数动态注入到存储过程中...显然,我知道你可以映射单个参数,如门=?和颜色=?然后替换值...但是,变量的争论怎么样,几乎像Java vargs我想的那样。

你永远是做一个SELECT * FROM CarTb,它只是在where子句可以是下列任何...

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

你的想法。

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

--Cheers,戴夫

+0

您是否有权访问数据库(例如,您可以编写存储过程),还是仅限于使用Java? – 2011-05-18 16:17:26

+0

是的...我编辑了原来的问题,以反映如此。 – f1dave 2011-05-18 16:23:30

回答

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); 
} 

然后,只需加入条款的列表(例如,利用番石榴的木):

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

然后遍历paramsquery.setParameter(key, value)

+0

嗯...似乎一个体面的想法。虽然我们可以有各种选择(即不仅仅是AND),但我们不需要进行某种自定义分析来确定将AND,OR,NOT等放置在哪里? – f1dave 2011-05-18 16:25:13

+0

好吧,如果你喜欢,你可以加入一个'StringBuilder'。或者有单独的名单和词曲,或词曲等。 – Bozho 2011-05-18 16:34:32

0

我能想到的一种作弊的方式,但我想/希望查询将被优化。您可以在准备好的声明中添加额外的参数,以确定您希望添加的条件,只有当该字段存在时才会评估为真。

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