OQL是什么? OQL 是一种类似 SQL 的查询语言,用于查询 Java 堆。OQL 允许从 Java 堆中过滤/选择所需的信息。 虽然 VisualVM 已经支持诸如“显示 X 类的所有实例”之类的预定义查询,但 OQL 增加了更多的灵活性。OQL 基于 JavaScript 表达式语言。 OQL 查询的形式如下: https://htmlpreview.github.io/? (注意管理员运行) 然后输入:http://localhost:7000/ 展示如下: 下面通过OQL语句查询,上面哪些可以自行了解。 不过OQL的学习还是需要了解一些sql基础语法,有sql经验的同学更易上学。 参考文章 https://htmlpreview.github.io/?
相关文章内容索引: ORM查询语言(OQL)简介--概念篇 ORM查询语言(OQL)简介--实例篇 ORM查询语言(OQL)简介--高级篇:脱胎换骨 ORM查询语言(OQL)简介--高级篇(续):庐山真貌 [OQL原理] .表达式的链式调用 OQL的设计完全基于面向对象的实体查询,OQL的使用采用对象表达式的方式,内部实现原理是一系列的“链式方法调用”。 ,比如OQL调用返回OQL1对象的方法,而OQL1对象又调用返回OQL2级对象的方法。 方法返回的对象是OQL1,而不是OQL,所以需要调用End 属性,返回本次操作OQL的当前对象实例,下面的方法实现能够说明这个原理: public OQL END { 一级表达式 --返回OQL1对象的方法或者属性调用,该级别的方法由OQL根级表达式生成并使用。
相关文章内容索引: ORM查询语言(OQL)简介--概念篇 ORM查询语言(OQL)简介--实例篇 ORM查询语言(OQL)简介--高级篇:脱胎换骨 ORM查询语言(OQL)简介--高级篇(续):庐山真貌 几乎在与Linq同一时期,PDF.NET也发明了自己的ORM查询语言,称为OQL。下面提到的OQL,都是指的PDF的OQL。 (图2:PDF.NET OQL 架构) 如果仅从查询调用端来观察,我们发现OQL,跟SQL逻辑上是等价的,一个是“对象化”的查询,一个是“结构化”的查询: 对象化查询:OQL->ORM-> Entity 1,数据查询: OQL q=OQL.From(entityObject) [. ([<entityObject.Property1>[,entityObject.Property2][,…]]|[OQL2]|[OQLCompare]) .End; 3,数据更新: OQL q=OQL.From
相关文章内容索引: ORM查询语言(OQL)简介--概念篇 ORM查询语言(OQL)简介--实例篇 ORM查询语言(OQL)简介--高级篇:脱胎换骨 ORM查询语言(OQL)简介--高级篇(续):庐山真貌 注意:图上的表达式中的形参 parent 其实是OQL对象,这里表示父级OQL对象,它参与构造它的子OQL对象。 (图4:高级子查询) ? PDF.NET的ORM查询语言OQL很早就注意到了这个问题,所以它的Select方法采用了非泛型化的设计,例如单个实体类属性字段选取: OQL q = OQL.From(user) 关联的OQL对象为空! 附录1:OQL测试完整源码 附录2:OQL测试程序输出的SQL信息
一般情况下,使用ORM框架来完成单个实体的查询是很方便的,但如果有复杂的查询条件,普通的ORM组件比较困难,PDF.NET数据开发框架的ORM实体类查询语言--OQL,使得构造复杂的查询条件成为可能 查询条件: OQL oql=GetOQLbyBussiness();//这个方法有4000行代码; string sql=oql.ToString();//大致是 select * from table1 ) 即可获得 List<EntityModelClass>,但现在为了添加另外一个表的查询,将oql转换成了sql语句,怎么能够再次生成实体类呢? 请注意,我们把oql的参数对象DataParameters 传递给了DAL方法,用于构造参数化查询。 总结: 结合使用PDF.NET框架的OQL+SQLMAP,可以在不放弃实体类的便利情况下,进行复杂的多表查询!
相关文章内容索引: ORM查询语言(OQL)简介--概念篇 ORM查询语言(OQL)简介--实例篇 ORM查询语言(OQL)简介--高级篇:脱胎换骨 ORM查询语言(OQL)简介--高级篇(续):庐山真貌 在写了《ORM查询语言(OQL)简介--概念篇》、《ORM查询语言(OQL)简介--实例篇》之后,觉得本篇文章应该是前2篇的延续,但又不是一般的延续,因为今天要写的这篇内容,是基于对框架OQL完全重构之后来写的 一、OQL之前生 1.1,内容回顾: OQL是我设计用来处理PDF.NET开发框架的ORM查询的,因此叫做ORM查询语言。 而OQL之前的版本,是不支持表的别名的,因此,对于连接查询,OQL生成的可能是这样子的SQL语句: SELECT teacher. OQL3 GroupBy(object field); //OQL4 Having(object field); //OQL4 OrderBy(object field)
OQL”语言“ 是PDF.NET数据开发框架的实体对象查询语言,一直以来,ORM的复杂查询条件都是困扰ORM的问题,所以很多时候不得不舍弃ORM,直接手工拼接SQL。 我们来看看OQL是怎么解决这些问题的,现在举一个今天同事遇到的问题: 有这样一个实体类 MyEntity,实体类的具体定义在此忽略,有兴趣的朋友请看我的博客。 F2='2') And (F3='a' OR F3='b' OR F3='c' ) And (F5='A' OR F5='B' OR F5='C' ) 下面我们来看看怎么使用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
下面我们来看看用SOD框架的OQL怎么处理。 <Pro_Products>() .With(OQL.SqlServerLock.UPDLOCK) .Select db.Commit(); 上面的操作,首先在AdoHelper对象上开启事务,然后查询投资产品实体的时候在With方法上加上 OQL.SqlServerLock.UPDLOCK 更新锁,接着进行复制的业务处理 我们看到,OQL的这种更新锁操作,跟直接写SQL语句操作很类似,OQL执行的时候也是这样输出SQL语句的,这样确保数据记录在并发的时候,安全的更新。 注意:OQL更新锁目前只支持SqlServer数据库。
,下面我们使用OQL来构造一个复杂的实体查询。 oql = OQL.From(user).Select().Where(result).END; Console.WriteLine("OQL To SQL is:\r\n" (); LocalDB.Table_Order order = new LocalDB.Table_Order(); OQL q_order = OQL.From "OQL To SQL is:\r\n" + oql.ToString()); /* * OQL To SQL is: SELECT UID,Name 对象: OQL oql;//用户相关的OQL对象; OQL q_order //订单相关的OQL对象; 关键点在于q_order 对象作为oql对象的 IN 查询的参数,实现了SQL的IN子查询: oql.Select
() { return EntityQuery<T>.QueryList(q); } public static OQL From<T>() 曙光:V5版本 PDF.NET Ver 5.0 在经过了脱胎换骨般的重构后,OQL增加了大量特性,OQL方法支持Lambda表达式语法,支持泛型,我们前面的代码有望得到简化: Users user 还有各种好处呢,PDF.NET基于实体类的实例调用特性,构筑起了OQL支持复杂查询的特性(参见 《ORM查询语言(OQL)简介--高级篇(续):庐山真貌》 ),SQL能够支持的,OQL基本上都能够支持了 oql,T entity) 15 { 16 this.currentOQL = oql; 17 this.currentEntity = 收工,PDF.NET 顺利实现一行代码查询数据的功能,除了Where 条件的复杂写法不那么优美,总体上GOQL,OQL可以媲美EF了!
: User li_si = new User() { Name = "li si", Pwd = "123" }; OQL insertQ= OQL.From 方式更新指定的数据 li_si.Pwd = "123456"; OQL updateQ= OQL.From(li_si) .Update(li_si.Pwd) //仅仅更新密码 = null; //查询到用户实体类,表示登录成功 } 这里我们使用了SOD框架的ORM查询语言--OQL,它的结构非常类似于SQL,你可以认为OQL就是对象化的SQL语句。 = null; //查询到用户实体类,表示登录成功 } 3.6,使用泛型OQL查询(GOQL) 使用泛型OQL查询(GOQL),对于单实体类查询最简单的使用方式,缺点是不能进行“连表查询 同样,框架也为你提供了OQL对象扩展方法来直接查询列表数据。
对象上,都有关联的SOD框架的实体类,它有一个“属性访问事件”,OQL对象订阅了该事件:
public class OQL
{
///
q = OQL.From(u).Select().Where(new OQLCompare(u).Comparer(u.Age, OQLCompare.CompareType.NoSmaller, 15 )).END ; OQL q = new OQL(u); //使用OQL2 作为条件对象 q.Select().Where(q.Condition.AND , PWMIS.Common.enumCompare.NoSmaller, 15) }).OrderBy(u.Age, "asc"); Console.WriteLine("OQL to SQL:\r\n"+q.ToString ()); //*************构建 OQL 查询表达式 ******* end ****** 实体类查询OQL表达式可以有多种Where条件构造方式,具体请看上面的代码。
Tool)工具来玩~ jhat (Java Heap Analyse Tool) 是用来分析java堆的命令,可可以将对中的对象以html的形式展示,包括对象的数量、大小等信息,并支持对象查询语言 (OQL Queries”一栏中点击不同的链接可以展示不同的内容,如 点击“Show heap histogram” 链接,展示堆快照直方图~ 点击“Execute Object Query Language (OQL ) query”链接,可以使用OQL查询~ OQL查询语法与Visual VM的OQL类似~ 基本语法如下: select <JavaScript expression to select> identifier> [ where <JavaScript boolean expression to filter> ] ] 可以点击此连接(oqlhelp.html)获取Visual VM OQL 更多信息~ 如,”获取所有ClassLoader类的名字“的OQL查询如下: select classof(cl).name from instanceof java.lang.ClassLoader
OQL如何支持CASE WHEN? 今天,一个朋友问我,OQL可否支持CASE WHEN语句? 所以,对SOD框架而言,对应ORM如何支持CASE WHEN,就等于是问OQL如何支持CASE WHEN了。 注意“新的方案”这个提法,我是不打算让OQL支持CASE WHEN这个特性的,为何要这样做呢? OQL只解决 80%的普通查询,其它复杂的查询,应该依托于其它技术,否则会增加OQL的复杂性; 复杂的查询,可以借助于SOD框架的SQL-MAP技术,将SQL语句写在SqlMap.config文件中; 因此,在SOD框架上使用“计算属性”,有一个必须注意的原则:“计算属性”不可以出现在OQL语句中。
,22) }); // User u = new User(); //*************构建 OQL q = OQL.From(u).Select().Where(new OQLCompare(u).Comparer(u.Age, OQLCompare.CompareType.NoSmaller, 15 )).END ; OQL q = new OQL(u); //使用OQL2 作为条件对象 q.Select().Where(q.Condition.AND , PWMIS.Common.enumCompare.NoSmaller, 15) }).OrderBy(u.Age, "asc"); Console.WriteLine("OQL to SQL:\r\n"+q.ToString ()); //*************构建 OQL 查询表达式 ******* end ******
属性名称必须与 Repository 查询方法的名称匹配,并且属性值是调用 Repository 查询方法时要执行的 OQL 查询。 10.3.执行 OQL 查询 Spring Data for Apache Geode Repositories 支持定义查询方法,以便针对托管实体映射到的区域轻松执行 Apache Geode OQL 如果支持的关键字不足以声明和表达您的 OQL 查询,或者方法名称变得过于冗长,那么您可以使用@Query如第三和第四种方法所示的注释查询方法。 下表提供了可在查询方法中使用的受支持关键字的简要示例: 10.4.使用注解的 OQL 查询扩展 许多查询语言,例如 Apache Geode 的 OQL(对象查询语言),具有 Spring Data 为了支持 Apache Geode 的 OQL 查询语言扩展并保持跨不同数据存储的可移植性,Spring Data for Apache Geode 通过使用 Java 注释添加了对 OQL 查询扩展的支持
本套框架的思想是借鉴Java平台的Hibernate 和 iBatis 而来,兼有ORM和SQL-MAP的特性,同时还参考了后来.NET的LINQ(本框架成型于2006年,当时还未听说过LINQ)使用风格,设计了 OQL ) DAL层SQL语句和.NET数据访问代码映射(查看 SQL-MAP 原理) 详细说来,框架还包含以下特色功能: 类似LINQ的支持ORM实体类查询的OQL表达式(有了LINQ为啥还要搞一个OQL? 本框架 OQL的基本设计在LINQ或者说本人知道 LINQ之前,另外,.NET3.5框架才正式支持LINQ,而我们公司的一个产品却因为采用了3.5框架安装部署不方便成为市场和客服常常抱怨的理由。 :借鉴了它的ORM原理和HQL语言,使用了类似的简单的ORM功能; iBatis:借鉴了其SQL-MAP功能,对其复杂性进行了大力精简; LINQ/Entity Framework:提供类似LINQ的OQL 语法 框架功能演示 表单数据绑定,分页显示-- 数据映射,查询-- SQL-MAP演示(请查看DAL层代码)-- OQL查询(演示请看TestSqlMapEntity 项目) 支持工具,提供代码生成器和
OQLCompare ,它就是根据“组合模式”设计的,我们来看看怎么由它来构造这个查询条件:
1,采用AND,OR重载:
FundReviews p = new FundReviews();//实例化一个实体类
OQL q = new OQL(p); //实例化一个OQL对象
Console.WriteLine("OQLCompare 复杂比较条件表达式测试---------");
OQLCompare 我们看到OQL采用了类似函数式的语法风格,但在[条件表达式]的构造过程中,还是显得很冗长,我们可以继续对OQLCompare对象进行重构:
///
OQL ? MAT 支持一种类似于 SQL 的查询语言OQL(Object Query Language),这个查询语言 VisualVM工具也支持。 OQL将类表示为表,对象表示为行,字段表示为列。 name="name"> [ WHERE <filter-expression> ] </filter-expression></class> 用F5或者Ctrl+enter或者点击红色的感叹号立即执行OQL 更多OQL相关的操作,推荐看官网: https://help.eclipse.org/2020-09/index.jsp?