我有一些数据库表,比方说CarTb,以及一个可以让您浏览可供出售的二手车的前端。
在前端,我可以尽可能少地过滤 - 向我展示所有蓝色车辆,向我展示所有带4门的红色车辆,向我显示所有车辆的标识号为XXX123或ipod功能和五个扬声器立体声。等
我希望能够在Java后端执行的操作是构建一个系统,该系统根据UI发送给我的内容动态查询数据库。我想知道是否有可能动态地将一整串参数注入到存储过程中...显然我知道你可以映射个别参数,如门=?和颜色=?然后在值中替换......但是变量争论呢,我猜想几乎就像Java vargs。
你总是从CarTb做一个select *,它只是where子句可以是以下任何一个......
你明白了。
有什么建议吗?我们确实有权访问hibernate,如果有帮助的话,还有sybase数据库(即我们可以编写另一个存储过程,以便在必要时执行此操作)。
- 干杯,戴夫
答案 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);
然后迭代params
和query.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