Java 动态查询:由用户确定的属性值和数量

Java 动态查询:由用户确定的属性值和数量,java,mysql,database,database-design,dynamic-sql,Java,Mysql,Database,Database Design,Dynamic Sql,我正在开发一个java系统,它根据用户在运行时选择的属性对系统的数据库(mysql数据库)进行统计。 例如,此查询: select count(*) from diseases where bloodtype = 'A+' & age BETWEEN 10 AND 20 & disease = 'coma' 其中“where”子句是在运行时确定的,因为我考虑使用动态SQL,所以查询可能如下所示: select count(*) from diseases where bloo

我正在开发一个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查询的方法,该查询的属性数及其值在运行时由用户的输入决定,但没有找到任何东西。你能指导我吗?

因为你不仅动态提供数据,而且还提供要查询的列,所以参数化查询不是一个可行的解决方案

您可能需要自己用Java创建语句并提供SQL注入保护



有关如何在不使用动态SQL(或使用Java字符串操作创建的查询)的情况下处理此问题的一些想法,请参阅,但对于您的用例来说,所有这些查询都可能是次优的。

因为您不仅动态提供数据,而且还提供要查询的列,所以参数化查询不是可行的解决方案

您可能需要自己用Java创建语句并提供SQL注入保护



有关如何在不使用动态SQL(或使用Java字符串操作创建的查询)的情况下处理此问题的一些想法,请参阅,但对于您的用例,所有这些问题都可能是次优的。

使用字符串函数在Java中构造
WHERE
子句。然后,要替换(和转义)参数,请参见


对不起,我不得不把你留在那里;我已经17年没有接触过Java了,所以我肯定会生疏。

使用字符串函数在Java中构造
WHERE
子句。然后,要替换(和转义)参数,请参见


对不起,我不得不把你留在那里;我已经17年没有接触过Java了,所以我肯定会生锈。

你可以使用JPA或Hibernate之类的框架吗?那么,条件查询可能是解决您的问题的一个优雅的解决方案

属性不是任意字符串,但必须与查询中使用的表的属性匹配

因此,如果为select子句中使用的每个属性定义一个谓词,如

Predicate p = builder.equal(attributeName, inputValue);
您可以使用用户使用的所有谓词动态地丰富查询

query.where(p)
有关此主题的更多信息,例如创建类型安全查询,请参阅或


将SQL查询构建为应用程序中的字符串会招致SQL注入攻击,应避免这种攻击。

是否允许使用JPA或类似Hibernate的框架?那么,条件查询可能是解决您的问题的一个优雅的解决方案

属性不是任意字符串,但必须与查询中使用的表的属性匹配

因此,如果为select子句中使用的每个属性定义一个谓词,如

Predicate p = builder.equal(attributeName, inputValue);
您可以使用用户使用的所有谓词动态地丰富查询

query.where(p)
有关此主题的更多信息,例如创建类型安全查询,请参阅或


在应用程序中将SQL查询构建为字符串会招致SQL注入攻击,应该避免这种攻击。

我曾想过这样编写动态查询:从疾病中选择count(*),其中bloodtype=?&年龄介于?及疾病=?&id=?&民族性=?&(其余数据库属性=?)并传递用户选择的值,并为非选择字段放置空单引号。(例如:id='')@Ciba--
'
意味着检查空字符串;这可能不是他想要的。我一直在PHP中动态构建
WHERE
子句。构建一个包含
key='value``和
以及它们的数组。确保正确地转义每个
@RickJames非常感谢。但是,很抱歉,我不确定“构建一个key='value``和'themes'的数组”是什么意思。这是否意味着我应该构建一个包含数据库属性名称的数组,每个属性都由字符串“value”初始化,当用户选择一个属性时,它在数组中的值将被分配另一个不同于“value”的值?如果可能的话,你能给我看一段代码来更好地理解吗+我如何确保逃逸每个“值”?我想到这样写动态查询:选择count(*)from diseases where bloodtype=?&年龄介于?及疾病=?&id=?&民族性=?&(其余数据库属性=?)并传递用户选择的值,并为非选择字段放置空单引号。(例如:id='')@Ciba--
'
意味着检查空字符串;这可能不是他想要的。我一直在PHP中动态构建
WHERE
子句。构建一个包含
key='value``和
以及它们的数组。确保正确地转义每个
@RickJames非常感谢。但是,很抱歉,我不确定“构建一个key='value``和'themes'的数组”是什么意思。这是否意味着我应该构建一个包含数据库属性名称的数组,每个属性都由字符串“value”初始化,当用户选择一个属性时,它在数组中的值将被分配另一个不同于“value”的值?如果可能的话,你能给我看一段代码以更好地理解吗?我如何确保转义每个“值”?