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

简介:

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语句,

 

复制代码
代码
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

有更多实例程序下载。

 


    本文转自深蓝医生博客园博客,原文链接:http://www.cnblogs.com/bluedoctor/archive/2010/11/28/1870095.html,如需转载请自行联系原作者




相关文章
|
2月前
|
Java 数据库连接 数据库
mybatis查询数据,返回的对象少了一个字段
mybatis查询数据,返回的对象少了一个字段
185 8
|
6月前
|
算法 BI 数据库
MyBatisPlus查询条件设置、映射匹配兼容性、id生成策略、多数据操作
MyBatisPlus查询条件设置、映射匹配兼容性、id生成策略、多数据操作
377 3
|
SQL Java 数据库连接
2021-08-05mapper代理,几种pojo输入输出,pojo扩展通过扩展继承,映射主键普通属性映射,动态SQL,逆向工程
2021-08-05mapper代理,几种pojo输入输出,pojo扩展通过扩展继承,映射主键普通属性映射,动态SQL,逆向工程
64 0
|
6月前
|
SQL Java 关系型数据库
Hibernate - Java 类型, Hibernate 映射类型及 SQL 类型之间的对应关系
Hibernate - Java 类型, Hibernate 映射类型及 SQL 类型之间的对应关系
63 0
|
6月前
|
SQL Java 数据库
JPQL语言和Query接口简解
JPQL语言和Query接口简解
51 0
|
Java 关系型数据库 MySQL
【MySQL用法】mybatis框架中,查询出来的实体类结果集中的某一个字段无法映射到实体类中的解决方案
【MySQL用法】mybatis框架中,查询出来的实体类结果集中的某一个字段无法映射到实体类中的解决方案
275 0
|
SQL Java 数据库连接
Mybatis 是如何将 sql 执行结果封装为目标对象并返回的?都有哪些映射形式?
Mybatis 是如何将 sql 执行结果封装为目标对象并返回的?都有哪些映射形式?
259 0
|
SQL Java 数据库
可将数据库表字段转换为Java代码驼峰字段SQL的实现
经常要将数据库表字段映射到实体对象,除了逆向工程,还可以通过SQL的方式将表字段列转换为Java代码驼峰字段。
1375 0
|
SQL Java 数据库连接
hibernate自定义sql关联查询结果组装为对象
hibernate自定义sql关联查询后没有对应的entity,如何映射为对应的bean
252 0
下一篇
无影云桌面