使用OQL“语言”构造ORM实体类的复杂查询条件

摘要:
e、 F2=“2”;代码OQLCompare cmp=新的OQLCompar(e);cmp.Compare(e.F2);//与实体类的属性值相等的比较可以写成cmp。比较(e.F2)OQLCompare cmpResult=null;“c”};值F3.长度;OQLCompare cmpCondationF5=空;i<

OQL”语言“ 是PDF.NET数据开发框架的实体对象查询语言,一直以来,ORM的复杂查询条件都是困扰ORM的问题,所以很多时候不得不舍弃ORM,直接手工拼接SQL。我们来看看OQL是怎么解决这些问题的,现在举一个今天同事遇到的问题:

有这样一个实体类 MyEntity,实体类的具体定义在此忽略,有兴趣的朋友请看我的博客。

MyEntity e=new MyEntity();
e.F1
="1";
e.F2
="2";
e.F3
="a";//其它可选值 a,b,c.....
e.F5="A";//其它可选值 A,B,C....

必要条件 F1 And F2,可选条件 F3,F4,F5,准备输出下面类似的SQL语句:

SELECT * FROM TABLE1 WHERE 
   (F1
='1' AND F2='2')
   
And
   (F3
='a' OR F3='b' OR F3='c' )
   
And
   (F5
='A' OR F5='B' OR F5='C' )

下面我们来看看怎么使用OQL来构造这个SQL语句,

使用OQL“语言”构造ORM实体类的复杂查询条件第1张使用OQL“语言”构造ORM实体类的复杂查询条件第2张代码
OQLCompare cmp = new OQLCompare(e);
OQLCompare cmpCondtion1
= cmp.Compare(e.F1) & cmp.Compare(e.F2);
//等于实体类属性值的比较可以直接这样写 cmp.Compare(e.F2)

OQLCompare cmpResult
=null;

//处理字段F3的条件
string[] ValueF3={"a","b","c"};//具体获取条件值的过程此略,用一个数组代替。
OQLCompare cmpCondtionF3=null;
if(ValueF3.Length>0)
{
    cmpCondtionF3
=cmp.Compare(e.F3,"=",ValueF3[0]);//取第一个
    if((ValueF3.Length>1)
    {
        
        
for(int i=1;i<ValueF3.Length;i++)
            cmpCondtionF3 
= cmpCondtionF3 | cmp.Compare(e.F3,"=",ValueF3[i]);//将其它条件作为 OR 条件

    }

    cmpResult
= cmpCondtion1 & cmpCondtionF3;
  
}

//处理字段F5的条件
string[] ValueF5={"A","B","C"};
OQLCompare cmpCondtionF5
=null;
if(ValueF5.Length>0)
{
    cmpCondtionF5
=cmp.Compare(e.F5,"=",ValueF5[0]);//取第一个
    if((ValueF5.Length>1)
    {
        
        
for(int i=1;i<ValueF5.Length;i++)
            cmpCondtionF5 
= cmpCondtionF5 | cmp.Compare(e.F3,"=",ValueF5[i]);//将其它条件作为 OR 条件

    }

    cmpResult
= cmpCondtion1 & cmpCondtionF5;
  
}

 现在我们构造成功了条件对象 cmpResult,接下来看看怎么样构造完整的OQL语句:

  

//e 是前面的实体类对象实例
OQL q=OQL.From(e).Select().Where(cmpResult).End;

  

当然也可以这样写,但没有上面简单:

OQL q=new OQL(e);
q.Select().Where(cmpResult);

  

如果只想查询F1,F2属性的值,这样写:

OQL q=new OQL(e);
q.Select(e.F1,e.F2).Where(cmpResult);

  

最后就可以到数据库查询实体了,非常简单:

List<MyEntity> result=EntityQuery<MyEntity>.QueryList(q);

至此,一个复杂的ORM查询使用OQL语言就完成了,是否方便,还得大家评说。

PDF.NET官网:http://www.pwmis.com/sqlmap

有更多实例程序下载。

免责声明:文章转载自《使用OQL“语言”构造ORM实体类的复杂查询条件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇CodeIgniter连接数据库及快速入门Android之ConnectivityManager下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

dynamic-insert和dynamic-update属性

dynamic-insert 作用:设置对象中没有值的字段 insert并不会对其进行插入. 实体类映射配置如下 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.o...

写一个工具生成数据库实体类

写一个java工具从数据库生成实体类 开始写之前的说明 ​ 这只是一个简单的解析数据库建表语句之后,根据解析结果生成java文件的一个简单工具。写的原因有两个。 ​ 1:项目中没有人写实体类的注释,字段的注释,现有的工具也没法根据数据库的注释自动添加到class文件上。 ​ 2:自己写一个也似乎不是很难。 ​ 所以就自己写了一个。 这里在生成java文件的...

gson 生成的json字符串带u003c,u003d,u003e的解决方案(gson将实体类转json)

1.情景展示 如上图所示,使用谷歌的Gson将实体类转json字符串,如果实体类的属性值,出现大于号、小于号、等号等符号时,调用GsonBuilder进行转换时,这些符号会被强制转换成unicode编码。 如何解决这个问题? 2.原因分析 错误方式一:使用replaceAll() 错误方式二:使用iso-8859-1解码 3.解决方案 方式一:使用...

权限管理 (一) 设计思路分析和实现授权、认证

权限的认识 说起对权限的理解可以说是从肤浅到了解,现在也只是处在了解的水平,先来看这样一个通俗且真实的故事:我们都知道在有体制的公司或者机关单位,给人的体制化特别突出,通俗的说就是官大一级压死人,上级的权利往往要比下面人大,有什么事情了需要经过上级审批、同意才能够执行,这也是一种法律程序,很多事情都需要走法律流程。 你没有在领导的位置上有些事情你说了就...

Java实体类自动生成serialVersionUID的方法

介绍在 Eclipse 和 IntelliJ IDEA 两种IDE中实现自动生成serialVersionUID的方法。 Eclipse 在Eclipse中创建实体类且实现Serializable序列化接口后,在类名所在行左侧有“黄色三角形感叹号提示符”且类名有黄色下划线提示(见下图), 第1步:单击提示符,弹出对话框 第2步:选中对话框中的“Add de...

自定义Mybatis Plus代码生成器(增加Vo类的生成)

最近有在学习使用mybatis plus,了解到使用mp代码生成器可以方便快捷的生成代码,为了适用于自己开发需要,自定义了一个mp的代码生成器,增加了几个小功能: 1.增加了Vo类的生成,其实思路很简单,利用生成的entity实体类,复制一份,替换掉其中的几个关键字就可以了。 2.可以根据表名,根据参数判断是否去掉前缀,然后根据剩余部分自动生成包名,在批量...