我正在开发一个java系统,它根据用户在运行时选择的属性对系统的数据库(mysql数据库)进行统计。例如,此查询:
select count(*)
from diseases
where bloodtype = 'A+' & age BETWEEN 10 AND 20 & disease = 'coma' 其中" where“子句是在运行时确定的,因为我考虑使用动态SQL,所以查询可能如下所示:
select count(*)
from diseases
where bloodtype = ? & age BETWEEN ? AND ? & disease = ?但问题是,在这个系统中,不仅(?)是在运行时确定的,也是where子句中的属性(例如:血型、年龄和id等)。
我在互联网上搜索过一种编写动态SQL查询的方法,该查询的属性数量和值在运行时由用户的输入确定,但没有找到任何东西。你能给我引路吗?
发布于 2016-04-10 20:50:26
由于您不仅动态地提供数据,而且还提供要查询的列,因此参数化查询不是一个可行的解决方案。
您可能需要用Java创建语句,并自己提供SQL注入保护。
请参阅I need to pass column names using variable in select statement in Store Procedure but i cannot use dynamic query,了解如何在不使用动态SQL (或使用Java string操作创建的查询)的情况下处理此问题--但对于您的用例来说,所有这些都可能不是最优的。
发布于 2016-04-11 14:44:53
在Java中使用字符串函数构造WHERE子句。然后,要替换(和转义)参数,请参见Setting CallableStatement input parameters。
对不起,我不得不把你留在那里;我已经17年没碰过Java了,所以我一定会生疏的。
发布于 2016-04-11 17:02:58
允许使用JPA或Hibernate之类的框架吗?那么对于您的问题,条件查询可能是一个很好的解决方案。
属性不是任意字符串,但必须与查询中使用的表的属性相匹配。
因此,如果要为select子句中使用的每个属性定义一个谓词,如
Predicate p = builder.equal(attributeName, inputValue);您可以使用用户选择的所有谓词动态丰富您的查询
query.where(p)有关此主题的更多信息,例如创建类型安全查询,请参阅。http://www.ibm.com/developerworks/java/library/j-typesafejpa/或http://docs.oracle.com/javaee/6/tutorial/doc/gjitv.html。
在应用程序中以字符串形式构建SQL查询会招致SQL注入攻击,应该避免。
https://stackoverflow.com/questions/36529807
复制相似问题