如何在java里实现复杂的动态查询功能?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在java里实现复杂的动态查询功能?相关的知识,希望对你有一定的参考价值。

我在用java做一个学生管理系统,现在想实现比较复杂灵活的动态查询功能。我有十几张数据表,我想根据用户的输入来动态确定输入值所在的表,并动态生成相应的SQL查询语句实现查询。
比如,用户先选择查询内容为T1表的Sname(学生姓名)和T2表的Tel(电话),并选择查询条件为Sno(学生学号),由此能动态生成SQL语句为"SELECT T1.Sname,T2.Tel FROM T1,T2 WHERE Sno='******' AND T1.Sno=T2.Sno "
即每次查询都只用到用户所输入值所在的那几张表,而且每一次输入都有可能不一样。
我想请问各位大神有没有做过类似的查询,想让各位教一下思路,或者推荐一些java library来辅助实现这个功能!谢谢大家了!

根据选择查询内容在后台动态拼接sql,比如条件A,select * from A,条件B换成select * from B.
前端也可以动态的显示要查询的内容。追问

谢谢你的回答,你说的这个方法只适合多条件查询的SQL语句拼接
可是我还需要考虑的是select 后面的选项也是用户可选的,而不只是select *
那这样的SQL语句又需要如何拼接呢?

追答

可以在前台控制,查询出所有列,不需要显示的列隐藏起来,像添加hidden属性什么的。

参考技术A 建议研究一下面向对象特性之一的多态。追问

我还是不太明白多态与这个查询的关联性?
我在网上查的时候,有些人说用数据库的存储过程,可是本人没怎么接触过存储过程的写法;
有些说用视图,但我觉得如果查询条件是动态不确定的话,要考虑的视图会很繁杂的。

基于Expression Lambda表达式树的通用复杂动态查询构建器——《剧透一下》

还在一行一行地手撸查询代码吗?有没有想过全自动的,通用的,免写代码的动态查询?上一篇简略讲了构造出可执行的表达式的原型实现,本篇来剧透一下多层嵌套查询Expression Lambda表达式的动态自动构建完之后有什么用法。

前篇《https://www.cnblogs.com/ls0001/p/17437225.html》有大佬在评论里剧透了,这里就来一遍剧透。

  通常,前后端分离的系统要在前端查询数据是提交一个带着查询条件参数的表单,比如A=1,B=2,类似样,后端接收到表单需要将这些条件参数拼接成查询需要写代码,并且表单结构通常是不带查询逻辑属性的,只能用and来联接这些条件,给查询的灵活性带来了局限。

本框架就是要提供更灵活的,后端不需要写代码的一个查询能力。

其中一个主要的应用场景正是实现实现只需前端传递JSON格式的查询条件到后端,后端无需写查询代码就能进行查询。

其流程如下图所示:

举个例子:

前端提交来的查询JSON:

  
     "lg": "", "filters":
     [ 
         
            "lg": "", "Predicates": 
            [  "lg": "", "Name": "id", "Op": ">", "Value": 1  ]
        , 
         
            "lg": "and", "Predicates": 
            [  "lg": "", "Name": "id", "Op": "<", "Value": 10  ] 
        ,
        
            "lg": "and",
            "Predicates":
            [
                "lg": "","Name": "name",  "Op": "=", "Value": "MyName",         
                "lg": "or","Name": "name","Op": "=","Value": "HisName"
            ]
        
    ]

 

后端只要如下代码就可以了:

Query.Where(QueryFilterBuilder.CreateFilterExpression<Entity>(上面的JSON));
​

 

尽管前端JSON的构造也需要一个轮子,后续再说,本篇暂且先到这。

 

以上是关于如何在java里实现复杂的动态查询功能?的主要内容,如果未能解决你的问题,请参考以下文章

如何针对分层对象列表动态构建和存储复杂的 linq 查询?

基于Expression Lambda表达式树的通用复杂动态查询构建器——《构思篇二》已开源

springboot JPA 一对多关联查询 ,动态复杂查询 去除重复数据 in语句使用

pl sql & java - 创建动态查询

Java如何实现多选项搜索功能(查询数据库)?

请教关于Spring Data JPA动态查询参数的问题