java - 根据用户定义的结果和条件在包含多个相关或不相关表的数据库中动态构建 SQL

标签 java mysql sql database jakarta-ee

我遇到一个j2ee项目,它是一个可以通过用户定义的结果和条件动态构造SQL的系统。我建议这样做: korzh 的 EasyQuery:DEMO

用户在此系统中可以执行的操作是:

  1. 配置结果
  2. 配置条件
  3. 执行自动生成的 SQL

喜欢:enter image description here

我的问题是:如何生成由用户配置的sql语句,这些用户选择的结果或条件字段可能位于不同的表中,我很困惑这些表也许相关,但也可能不相关。

例如,如图所示,

  • 我选择了客户(表)-> [客户公司名称]、[订单 ID] (字段)作为结果。
  • 我选择了 Product(table) -> [Product ID = 1] 作为条件。

系统会生成一条SQL:

SELECT DISTINCT Customers.CompanyName AS "Customer Company name", Orders.OrderID AS "Order ID" 
FROM (((Customers AS Customers
 INNER JOIN Orders AS Orders ON (Customers.CustomerID  = Orders.CustomerID ))
 INNER JOIN Order_Details AS Order_Details ON (Orders.OrderID  = Order_Details.OrderID ))
 INNER JOIN Products AS Products ON (Products.ProductID  = Order_Details.ProductID ))
WHERE
( Products.ProductID = 1 )

系统如何找出这些表之间的内在关系,例如:

(((Customers AS Customers
     INNER JOIN Orders AS Orders ON (Customers.CustomerID  = Orders.CustomerID ))
     INNER JOIN Order_Details AS Order_Details ON (Orders.OrderID  = Order_Details.OrderID ))
     INNER JOIN Products AS Products ON (Products.ProductID  = Order_Details.ProductID ))

换句话说,我想知道“即席查询”是如何通过用户的配置生成可行的SQL语句的。有没有Java的库?

非常感谢您的帮助。

最佳答案

您可以使用 MySQL INFORMATION_SCHEMA 获取表之间的关系 例如。

select
  TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
from INFORMATION_SCHEMA.KEY_COLUMN_USAGE
where
  REFERENCED_TABLE_NAME = '<table>';

来自here

这样就可以获得一张表的所有引用字段。浏览所有表格,构建与列名称的关系图。

然后在您的查询中只需包含所有必要的表并使用它们的关系来创建 INNER JOIN 条件并正确填充 FROM 部分(一个表可以包含多次,因此您可能需要别名)

然后只需将连接表的必要字段包含到 SELECT 和 WHERE 部分即可。

关于java - 根据用户定义的结果和条件在包含多个相关或不相关表的数据库中动态构建 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34013884/

相关文章:

java - 检查子字符串是否存在于java中的字符串数组列表中

mysql - 如何在 Laravel 5 中将列更改为 "not null"?

android - android开发中连接外部数据库

sql - oracle如果行不存在则插入

mysql - 我可以将 Unique 约束和 Not Null 约束设置为 SQL 中的同一列吗?

Java:使用 FileChannel 写入文件会使文件缩小?

java.util.date格式转换

javascript - 使用sequelize 获取字段中具有唯一值的所有行

java - jsp页面报错怎么解决?

mysql - SQL计算几个不同组中的项目数量