该博客将主要通过Spring查询DSL框架介绍服务器查询分析和实现服务器查询和实现。
查询函数应用于各种应用程序,非常重要。用户使用的查询函数经常在我们做得很好的UI接口上查询。UI将将查询请求发送到实施的服务器,或者负责实现查询的组件。有更多框架在市场上查询,这些框架更为著名且广泛使用。Elasticsearch。
对于服务器,必须根据某些规则组织前端UI发送的查询请求。这样的规则后端必须能够支持和分析。换句话说,只需要遵循服务呼叫者与服务发布者之间的相同规范。Baidu的UI查询是这样定义的:
上图中添加线路的位置是我们在百度中搜索的字符串内容。可以发现,Baidu的实现被处理为HTTP请求的URL请求的参数。作为键,Q背后的内容是查询的内容。
Google的实现相似,如下图所示:
只有一个搜索框,例如Google和Baidu。该处理更为合理,并且不是整个查询中最关键的部分。更重要的是后续服务器如何处理此查询内容。对于某些其他产品,可能需要一些关键字才能单独查询。目前,绝对不需要一个可以满足的搜索框。
通常,我们可以有以下方法来组织查询
类似Google的查询此典型应用程序是一个可以检查的查询框,例如Google和Baidu。对于此类查询要求,只需在构建查询请求时将查询内容放在HTTP请求的参数中。
这种查询分析非常方便。难以考虑查询的地方要查询什么。从数据库的角度来看,哪些数据库将查询哪些数据库。
特定字段SQL查询的SQL查询在某个字段中指定,然后使用SQL语句查询。各种查询条件以某种形式组织在一起,并发送到服务器进行分析。服务器分析查询的更高查询要求更高,并且提供了一些更具体的查询条件。
例如,如果我们在结肠中表达平等,则查询字符串的形式为:
此查询意味着查询名称等于账单记录。
我们还可以将多个条件缝合在一起,并让它们与逻辑关系(例如或与逻辑关系)结合在一起。例如:
或以下关系之间的关系:
上面的查询语句意味着我们的正面和后台必须定义其自己的查询逻辑和体系结构,分析并将其转换为正确的查询。如果我们想实现灵活的查询,则应在上面的查询语句中自由地组合。合规性。如何取决于我们的实际需求。如果删除查询关键字可以满足我们的需求,那么在当前时期内自然是合理的。
但是,从灵活性的角度来看,技术的角度,意识到灵活分析显然是我们想要的功能。最初的灵活性当然是SQL语句支持可以支持哪些类型的查询。我们都可以支持相应的查询,但这对服务器的分析逻辑具有更高的要求,尤其是当主表与查询混合时,它甚至是morecomplex
什么是queryDSl?queryDSL是一个可以帮助我们通过所提供的API构建类似SQL的查询的框架,即我们上面提到的组织查询方法。您可以通过像QueryDSL这样的平滑API构造函数构造查询。
queryDSL是出于需要在一种安全性中维护HQL查询的需求。HQL查询的增量结构需要一个字符串连接,这导致难以读取的困难代码。对域类型和属性的不安全引用纯字符串是字符串的HQL结构的另一个问题。
随着域模型的持续更改,类型安全性在软件开发中带来了巨大的好处。域更改直接反映在查询中,并且查询结构中的自动完成功能使查询构造函数更快,更安全。
Hibernate的HIQL是QueryDSL的第一种目标语言。现在,QueryDSL支持JPA,JDO,JDBC,Lucene,Hibernate Search,MongoDB,Collections和RDFBEAN作为后端。
它的官方网站在这里:http://querydsl.com/
QueryDSL和Spring必须做什么?几个弹簧数据模块通过querydslpredicateExecutor提供了与queryDSL的集成,如下所示:
谓词是我们需要通过的抽象。
在春季使用QueryDSL,只需在春季继承存储库接口,如下所示:
定义上述接口后,我们可以使用查询来编写类型安全,如以下示例所示:
上面构造的谓词反映在SQL语句中的单词中:。这是SO称为SQL查询,它非常直观。
因此,我们可以将收到的查询请求转换为相应的预测,并且从技术上讲,只要由预测支持的查询缝线可以支持它,那么困难就是如何分析查询请求以及如何将其转换为相应的对应关系。谓词。
以下是使用Spring和QueryDSL动态查询的示例。
现在假设我们的模型类如下:
我们希望可以直接和自由地查询此类的所有领域,并且可以根据和谐的逻辑进行查询。我们同意使用结肠:例如:
上面的查询相对清楚,分析不会太困难。让我们看一下这样的查询:
此查询的问题是,作为逻辑和GER性别查询,是否仅在先前的情况下进行操作,或者在前两个条件下执行操作,显然情况和条件通常以过滤器。
因此,我们应该将其视为整个条件的整个条件和操作,因此我们需要先组合先前的条。例如,我们可以使用括号来表示此逻辑,因此查询将成为:
现在逻辑变得清晰,问题在于如何分析它
谓词的逻辑如下:
booleanexpressionbuilder的逻辑如下:
查询条件的抽象类搜索标准定义如下:
近似实现逻辑如下图所示:
关键点是以下内容:
主表包含多个子计数据数据的和查询距离描述。现在有数据定义如下:
父节点表是客户,子节点市场信息存储在市场表中。
现在,假设我们有这样的查询:
毫无疑问,应该找到上述数据。现在查询条件已成为以下内容:
现在的问题出现了,该声明意味着客户的标记既是非活动的又是ID,但是该客户有多个市场。从整个数组中可以满足此条件。但是,单个市场个人无法满足此条件。作为用户,我们想要获得的效果必须无法调查此客户信息。
这将为实施带来问题,因为由于市场是一个数组,因此数据表中有几个记录。在分析和构建子表格查询时,我们必须确保子表的查询条件在单独的一个。节点是单独的记录,而不是从整个数组中检查,否则会有问题。
PS:防止本文被发现无法找到本文。
原始:https://juejin.cn/post/710358912731281956