AppFramework1.0数据库访问组件使用说明(六)QueryFilter的使用

什么是 React-Query 以及如何使用 React 查询获取数据? 我们使用 useState 它允许您向功能组件添加状态,我们使用 useEffect 从后端获取数据并将其存储在我们的状态变量中。queryKey -> queryKey 是查询的唯一标识符,它用于缓存,我们将其设置在一个或多个值的数组中。queryFn -> 这是我们用来从后端获取数据的函数,该函数应该返回一个解析数据或抛出错误的承诺。我们有很多问题,这就是我们使用 React-query 的原因。但是这段代码有问题,我们没有关注点分离,我们的查询被泄露了。通常这就是我们从后端获取数据的方式。 阅读详情
 
QueryFilter是AppFramework提供的一个功能强大、不需要编写SQL语句、跨数据库、参数化、执行性能优异的查询条件构造器。有了QueryFilter我们不需要再拼装SQL语句,不用再担心单引号导致SQL注入的安全漏洞,不用担心被众多的AND、OR、NOT等逻辑运算符弄得晕头转向,不用区分处理TO_DATE、UPPER等无法跨数据库的表达式。因此,QueryFilter是AppFramework提供的一项非常重要的特色功能,极大地提升了数据库应用系统的开发效率。
QueryFilter它是一种由多个项组成可嵌套的多层树状结构,通一层上的项与项之间是“与”或者“或”的逻辑关系,最顶层的项集合可以通过Items属性获取到。QueryFilter的结构非常直观简单,例如,页面上有三个查询条件,如下所示:
 
 
这三个条件就对应到三个QueryFilter项,查询项之间的关系为“与”,代表着只有三个条件同时满足才能命中记录。QueryFilter项可以由下列几种不同的类型组成:
1、       string:SQL表达式,确保可以实现任意功能,但无法保证可移植性;
2、       DBField:字段表达式,具有较好的可移植性,可以描述“字段 操作符 值(或表达式)”这种形式的表达式,其中“值(或表达式)”可以有三种形式,分别是SQL表达式、常量、SelectStatement子查询;
3、       QueryFilter:嵌套的QueryFilter,例如:A and (B or C),其中的(B or C)可以作为一个嵌套的QueryFilter;
4、       SqlMap:用于集成SQL模板(SqlTemplate)提供的功能。SQL模板具有较强的可视性,容易编写和维护,在配置文件里编写后由代码生成器直接生成SqlMap的子类,然后可以作为QueryFilter的一个项来运行,这种做法可以提高SqlTemplate的复用度,也提高了QueryFilter的灵活性;
 
QueryFilter属性方法说明:
属性/方法
类型
说明
Items
ArrayList
用来存放组合条件的集合,其元素可以是 DBField、QueryFilter、String、SqlMap
And
bool
指定各个组合条件之间的关系, 默认 And
Not
bool
指定是否对当前QueryFilter进行取反运算,默认 false
QueryFilter(bool isAnd)
无
构造。
isAnd为true表示各个组合条件之间关系为And; 为false: 表示为Or;默认为 true
Add(DBField field)
void
添加一个参数条件, 注意,field 的构造函数可以构造为子查询,因此此方法可以增加一项子查询
Add(QueryFilter filter)
void
添加一个子组合条件
AddSubFilter(bool isAnd)
QueryFilter
添加一个子组合条件
Add(string expression)
void
添加一个表达式
Add(string fieldName, DBOperator op, string queryString)
void
添加字段查询条件,若 queryString 为 null 或空则忽略
AddString(string fieldName, string queryString)
void
添加字符字段查询条件,不区分大小写,全模糊。若 queryString 为 null 或空则忽略。
AddString(string fieldName, string queryString, QueryFuzzyType fuzzyType)
void
添加字符字段查询条件,不区分大小写。若 queryString 为 null 或空则忽略。
AddString(string fieldName, string queryString, QueryFuzzyType fuzzyType, bool caseSensitive)
void
添加字符字段查询条件。若 queryString 为 null 或空则忽略
AddString(string fieldName, string queryString, QueryFuzzyType fuzzyType, bool caseSensitive)
void
添加字符字段查询条件。若 queryString 为 null 或空则忽略
AddDateRangeBegin(string fieldName, object date)
void
添加日期范围的开始日期。若 date 为 null 或空串则忽略
AddDateRangeEnd(string fieldName, object date)
void
添加日期范围的结束日期。若 date 为 null 或空串则忽略
Add(SqlMap sqlMap)
void
添加 SqlMap
 
在上一章节提到的例子中,可以这样构造QueryFilter:
QueryFilter filter = new QueryFilter(true); // true表示项之间的逻辑关系为“and”
 
// 添加“名称”查询条件 NAME like "%xxx%"
filter.Items.Add(new DBField("NAME", DBOperator.Like, "'%" + txtName.Text + "%'");
 
// 添加“开始日期”查询条件 START_DATE >= xxx
filter.Add(new DBField("START_DATE", DBOperator.GreatThanOrEqual, DateTime.Parse(txtStartTime.Text).Date));
 
// 添加“结束日期”查询条件 END_DATE <= xxx
filter.Add(new DBField("END_DATE", DBOperator.LessThan, DateTime.Parse(txtEndTime.Text).Date.AddDays(1)));
 
using (IDBSession session = DBSessionManager.Default.GetSession())
{
    DataTable dt = session. QueryDataTable("BAS_USER", "*", filter, null);
}
 
注意,添加“名称”查询条件也可以用直接添加SQL表达式的方式,但要对输入项txtName.Text进行单引号转义以避免产生SQL注入漏洞,上面基于DBField构造查询条件因生成参数化SQL则没有漏洞问题。
// 添加“名称”查询条件,直接添加SQL表达式
filter.Add("name like '%"+txtName.Text.Replace("'", "''")+"%'");
但上面的写法还是过于简单,实际上对于字符串查询条件一般都要过滤掉头尾的空格,并且还要检验用户是否输入了,输入了才产生查询SQL,因此完整的写法应该是:
QueryFilter filter = new QueryFilter(true); // true表示项之间的逻辑关系为“and”
// 添加“名称”查询条件 NAME like "%xxx%"
string name = txtName.Text.Trim();
if (name.Length > 0)
{
    filter.Items.Add(new DBField("NAME", DBOperator.Like, "'%" + name + "%'");
}
 
// 添加“开始日期”查询条件 START_DATE >= xxx
if (txtStartTime.Text.Length > 0)
{
    filter.Add(new DBField("START_DATE", DBOperator.GreatThanOrEqual, DateTime.Parse(txtStartTime.Text).Date));
}
 
// 添加“结束日期”查询条件 END_DATE <= xxx
if (txtEndTime.Text.Length > 0)
{
    filter.Add(new DBField("END_DATE", DBOperator.LessThan, DateTime.Parse(txtEndTime.Text).Date.AddDays(1)));
}
 
using (IDBSession session = DBSessionManager.Default.GetSession())
{
    DataTable dt = session. QueryDataTable("BAS_USER", "*", filter, null);
}
为了简化查询业务的实现,QueryFilter提供了几个非常智能的方法,能够快速实现输入预处理、非空判断、查询条件构造等,推荐使用下列方法实现查询业务:
QueryFilter filter = new QueryFilter(true); // true表示项之间的逻辑关系为“and”
 
// 添加“名称”查询条件 NAME like "%xxx%"
filter.Items.AddString("NAME", txtName.Text);
 
// 添加“开始日期”查询条件 START_DATE >= xxx
filter.AddDateRangeBegin("START_DATE", txtStartTime.Text);
 
// 添加“结束日期”查询条件 END_DATE <= xxx
filter. AddDateRangeEnd("END_DATE", txtEndTime.Text);
 
using (IDBSession session = DBSessionManager.Default.GetSession())
{
    DataTable dt = session. QueryDataTable("BAS_USER", "*", filter, null);
}
注意,上述代码中许多常量被硬编码了,例如字段名“NAME”、“BEGIN_DATE”、表名“BAS_USER”等,一种好的做法是采用代码生成器生成的元数据常量来编码,例如:
 
filter.AddString(BasUserDef.Name_FieldName, txtUserName.Text, QueryFuzzyType.RightFuzzy);
filter.AddDateRangeBegin(BasUserDef.UpdatedTime_FieldName, beginDate.Text);
filter.AddDateRangeEnd(BasUserDef.UpdatedTime_FieldName, endDate.Text);
 
此外,AddString有多个重载方法,支持多种模糊查询选项,包括大小写是否区分,开发者可以根据实际需要选用其中一个方法:
/// <summary>
/// 添加字符字段查询条件,不区分大小写,全模糊。若 queryString 为 null 或空则忽略。
/// </summary>
/// <param name="fieldName">字段名</param>
/// <param name="queryString">查询值</param>
public void AddString(string fieldName, string queryString);
 
/// <summary>
/// 添加字符字段查询条件,不区分大小写。若 queryString 为 null 或空则忽略。
/// </summary>
/// <param name="fieldName">字段名</param>
/// <param name="queryString">查询值</param>
/// <param name="fuzzyType">模糊方式</param>
public void AddString(string fieldName, string queryString, QueryFuzzyType fuzzyType);
 
/// <summary>
/// 添加字符字段查询条件。若 queryString 为 null 或空则忽略。
/// </summary>
/// <param name="fieldName">字段名</param>
/// <param name="queryString">查询值</param>
/// <param name="fuzzyType">模糊方式</param>
/// <param name="caseSensitive">是否区分大小写</param>
public void AddString(string fieldName, string queryString, QueryFuzzyType fuzzyType, bool caseSensitive);
 
 
LMX2820即时校准实战:从失锁到稳定锁频的完整指南 本文详细解析了LMX2820锁相芯片在高频段(11.3-22.6GHz)易出现随机失锁问题的根源,并提供了即时校准(InstCal)的完整实战指南。通过寄存器编程、Index例程和校准配置的关键步骤,确保从失锁到稳定锁频的高可靠性,大幅提升射频合成器在通信与测试测量应用中的性能。 阅读详情

相关推荐

研发工作量科学量化评估模型:从多维系数到等级落地指南

摘要:本文提出了一套基于多维系数的科学量化评估模型,用于精准评估软件开发工作量。该模型从需求复杂度、技术难度、质量要求和依赖风险四个核心维度进行量化评估,通过系数乘积计算综合工作量。文章详细说明了各维度的系数区间划分标准,并演示了从基础工作量估算到综合系数计算的具体步骤。该模型通过结构化评估过程,将主观经验转化为客观量化指标,帮助团队提高工作量评估的准确性,增强项目交付的可预测性。其价值在于使评估过程透明化、结构化和可追溯,从而减少项目延期风险,优化资源规划。

友莘居士的博客 1679

关于query.filter()的一些常用的方法

equals:    query.filter(User.name=='ed') not equals: query.filter(User.name!='ed') like: query.filter(User.name.like('%ed%')) in: query.filter(User.name.in_(['ed','wen','jask'])) not in: ...

young_kp的博客 2万+

揭秘个人开发者接支付宝的‘野路子’:不用企业资质,用Python模拟扫码转账与回调监听

本文探讨了个人开发者如何通过Python模拟支付宝扫码转账与回调监听的技术实现,解析了支付宝URL协议格式,并设计了本地化的支付状态监听方案。文章强调该方法仅用于技术研究,实际应用需遵守支付宝官方接口和金融合规要求。

weixin_30736301的博客 408

query.filter()的一些常用的方法

equals: query.filter(User.name=='ed') not equals: query.filter(User.name!='ed') like: query.filter(User.name.like('%ed%')) in: query.filter(User.name.in_(['ed','wen','jask'])) not in: query.filter(~User.name.in_(['ed','wen','jask'])) in null: query.f

yutu75的博客 4932

Unity 机械臂控制(二)——从碰撞检测到姿态解算:实现精准抓取

本文详细介绍了Unity中机械臂控制的实现方法,从碰撞检测到姿态解算,涵盖精准抓取的全流程。重点讲解了碰撞检测的分层处理、状态机设计、逆向运动学(IK)算法以及抓取稳定性优化等关键技术,并提供了实用的调试技巧和性能优化建议,帮助开发者实现高效的机械臂控制。

weixin_28693447的博客 304

用python提取PDF中各类文本内容的方法

用python提取PDF中各类文本内容的方法

安静的软件工程师 6083

flask SQLAlchemy query.filter_by 常用操作符

常用的filter操作符 下面的这些操作符可以应用在filter函数中 equals: query.filter(User.name == 'ed') not equals: query.filter(User.name != 'ed') LIKE: query.filter(User.name.like('%ed%')) IN: ...

weixin_30929011的博客 1335

S32K1XX调试--快速定位HardFault

1、背景 程序运行,发现程序跑飞到HardFault,但不清楚为什么会跑到HardFault中断处理函数去。 2、分析 要想知道为什么会跑到HardFault_Handler中去,就很有必要了解一下,程序上一条执行的是那条命令。 根据汇编指令可以定位上条指令,但如果对汇编指令不是很了解的话,那就很头疼了 根据单步运行也能实现定位,但如果程序量很大,又很杂,可能花费的时间就比较久些。 3、问题查找 提供一种不需要懂汇编指令的查找方法,方法如下: 在中断处理函数中插入以下代码,以及另外定义

ping_devil的博客 4018

es 搜索中同时包含 “query“ 和 “filter“ 子句

Elasticsearch支持很多查询方式,其中一种就是DSL,它是把请求写在JSON里面,然后进行相关的查询。

lxw1844912514的博客 3534

【无人机基站】基于K-mean算法实现无人机基站部署附matlab代码

【无人机基站】基于K-mean算法实现无人机基站部署附matlab代码

天天酷科研的博客 241

分数间隔均衡器的基本原理及应用(使用Matlab)

通过对接收信号进行加权求和,分数间隔均衡器可以抵消信号在传输过程中受到的频率响应失真。Matlab提供了丰富的工具和函数,可以方便地实现分数间隔均衡器,并进行性能评估。分数间隔均衡器(Fractional Interval Equalizer)是一种数字信号处理技术,用于均衡带通信道中的信号失真。分数间隔均衡器的基本原理是通过对接收信号进行加权求和,以抵消信号在传输过程中受到的频率响应失真。分数间隔均衡器在通信系统中具有广泛的应用。最后,我们通过比较均衡后的信号和发送数据的阈值来进行解调,并计算误码率。

2301_79325657的博客 675

QueryFilter的子字段设定

QueryFilter有一个SubFields属性和一个AddField方法。 对于SubFields属性是这样描述的。The comma delimited list of field names for the filter。 对于AddField方法是这样描述的。Appends a single field name to the list of sub-fields。 而

jiushidt的专栏 4016

SAPGUI excel 导出时遇到的运行时错误:STRING_SIZE_TOO_LARGE

当报表导出需求远超单一 XLSX 文件的物理承载力时,与其在 SAPGUI 中硬拼 2 GB 限制,不如把分页、过滤、流式写入作为设计前提。掌握 ABAP2XLSX 或 CSV + Power Query 等工具链,既能满足审计合规,又能让应用服务器远离的噩梦。祝你在下一次导出海量数据时,既高效又优雅。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 638

AppFramework最新版本V1.2安装包下载地址:http://download.csdn.net/source/334024【原V1.1/1.0版本的用户应尽快下载V1.2版】

安装包下载地址:http://download.csdn.net/source/334024 SOCKET 网络日志接收器下载地址:http://download.csdn.net/source/327016V1.2修改记录:1)修改了 V1.1/V1.0 的代码生成bug:当主键是字符串类型时,生成重复的DAO方法导致编译失败。2)修改了 TextParameter 类名为 Te

框架提高生产力 9389

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

elasticSearch(五):你真的了解query和filter的区别么?

ElasticSearch查询语句中的query和filter具有不同的用途。query:用于评估文档相关性,并对结果进行评分,用于搜索场景;filter:用于筛选文档,不会对文档进行评分,通常用于过滤场景。根据定义就可以知道性能方面filter比query更有效,因为不需要进行评分,并且可以做缓存。但要注意当同时需要评分和筛选文档时,可以使用带有query和filter的组合检索查询。平时开发中有精确搜索时,可以采用filter的方式性能要比query好。

tangjieqing的博客 474

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

elasticsearch的查询器query与过滤器filter的区别

很多刚学elasticsearch的人对于查询方面很是苦恼,说实话es的查询语法真心不简单… 当然你如果入门之后,会发现elasticsearch的rest api设计是多么有意思。 说正题,elasticsearch的查询有两部分组成:query and filter 。 下面是官方的query vs filter的介绍,其实说的也是不明不白的. https://www.el...

JacksonKing的专栏 548

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

吃透 | Elasticsearch filter和query的不同

少啰嗦,直接看东西。——罗永浩 1、query和filter的本质区别? 以下几张图能更好的概括: query关注点:此文档与此查询子句的匹配程度如何? filter关注点:此文档和查询子句匹配吗? 2、Query检索细化关注点 1)是否包含? 确定文档是否应该成为结果的一部分. 2)相关度得分多少? 除了确定文档是否匹配外,查询子句还计算了表示文档与其他文档相比匹配程度...

铭毅天下Elasticsearch 5万+

Spring 注解

@Autowired适用于set方法,成员,构造参数三种自动装配。 情况下,找不到匹配的bean会抛出异常,需要在里面声明(required=false),虽然不会报错。但是bean为null 每个构造器只有一个被声明为(required=true) @request只适用于bean的属性setter方法,表示受影响的bean属性必须在配置时被填充,通过在bean的定义或者自动装配一个明确的

qq_23871147的博客 374

Ant-Design-Pro-V5 :QueryFilter高级筛选组件、Table以及Pagination组件结合实现查询。

Ant-Design-Pro-V5 :QueryFilter高级筛选组件、Table以及Pagination组件结合实现查询。

~~~ 1994

FilterQuery过滤查询

FilterQuery过滤查询

m0_62565675的博客 1110

python query.filter函数_Django ORM filter() 的运用详解

最近发布代码的时候,遇到一个问题,发现Python中eval()函数的危险性.然而我还是个菜鸟,其中有一段代码是这样的。queryset = eval("models.TUserInfo.objects.filter({0})[{1}:{2}]".format(select,page_num * page - page_num,page_num * page))代码场景:这是一个获取信息的API....

weixin_39663933的博客 1846

ES的多种搜索机制:query string search,query DSL,query filter,full-text search,phrase search,highlight search

1、query string search搜索全部商品:GET /ecommerce/product/_searchtook:耗费了几毫秒 timed_out:是否超时,这里是没有 _shards:数据拆成了5个分片,所以对于搜索请求,会打到所有的primary shard(或者是它的某个replica shard也可以) hits.total:查询结果的数量,3个document hits

涂作权的博客 2024

ElasticSearch7.3学习(二十一)----Filter与Query对比、使用explain关键字分析语法

filter,不需要计算相关度分数,不需要按照相关度分数进行排序,同时还有内置的自动cache最常使用filter的数据。在实际的应用过程中,需要查询的逻辑一般比较复杂,那当语句冗长的时候,这时候显然不太可能通过直接执行语句来调试语法正确与否,这个时候就可以通过explain来验证语句的正确性。说明在使用query查询的过程中,影响到了相关度(score)的排序,在使用filter进行查询,并不会影响相关度(score)的计算。query,相反,要计算相关度分数,按照分数进行排序,而且无法cache结果。

639

flask-17 flask-sqlalchemy查询

查询记录 那么我们怎么从数据库中查询数据?为此,Flask-SQLAlchemy 在您的Model类上提供了query属性。当您访问它时,您会得到一个新的所有记录的查询对象。在使用all()或者first()发起查询之前可以使用方法filter()来过滤记录。如果您想要用主键查询的话,也可以使用get()。 一、查询 示例 1、查询所有: 模型类.query.all() 等价于 select * from user; 2、有条件的查询: 1)模型类.query...

春天的波菜 7848

flask query filter常用操作符

常用的filter操作符下面的这些操作符可以应用在filter函数中equals:query.filter(User.name == 'ed') not equals:query.filter(User.name != 'ed') LIKE:query.filter(User.name.like('%ed%')) IN:query.filter(User.name.in_(['ed', 'wend...

chen_153849588的博客 9467

无法嵌入互操作类型 请改用适用的接口_嵌入式系统第12次课

视频:复习第3章嵌入式编程基础第4章嵌入式系统开发和调试技术嵌入式系统开发的第一步就是要搭建交叉编译环境,以建立宿主机-目标机的开发和调试模式。ARM交叉编译工具是一个包含包括准库、编译器、链接器、汇编器和调试器的开发工具包。在嵌入式开发中,使用make和Makefile工具能简洁明快地处理各个源文件之间复杂的相互关系,提供项目的开发效率。4.1 ARM开发环境的搭建由于嵌入式系统的系...

weixin_39755625的博客 449
上一篇: AppFramework1.0数据库访问组件使用说明(五)IDBSession使用详解
下一篇: AppFramework1.0数据库访问组件使用说明(七)SqlTemplate与SqlMap的使用
AppFramework
博客等级 码龄19年 61粉丝 29原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值