OQL中的两个概念对象
case 1: 把属性替换为列名,对象替换为表名
结果:
case 2:
User对象指定了别名,所以a.UserId要根据别名确定属性UserId来自User对象,然后将UserId替换为列名
有子查询,所以t.CreateBy需要到子查询里面搜索CreateBy属性来自哪个对象,这个case中可以查到来自Org,所以需要替换为Org对象上CreateBy属性映射的自段名
from User a
inner join(
select distinct CreateBy from Org where OrgId=?
) t on t.CreateBy=a.UserId
结果:
from Sys_User a
inner join(
select distinct Create_By from Sys_Org where Org_Id=?
) t on t.Create_By=a.Usr_Id
case 3: 深入下去,情况就越复杂。
这个case跟case 2的唯一区别是,子查询里面select出来的属性又指定了别名,并且跟属性名字还是一样。所以t.CreateBy不应当替换
from User a
inner join(
select distinct CreateBy as CreateBy from Org where OrgId=?
) t on t.CreateBy=a.UserId
结果:
from Sys_User a
inner join(
select distinct Create_By as CreateBy from Sys_Org where Org_Id=?
) t on t.CreateBy=a.Usr_Id
case 4: 更复杂一点的情况。一个假想的语句,贫血模型中界面显示经常有类似需求,业务上大致意义可能是: 一个父子关联关系,存在一张表中。按父节点名称模糊查询,显示所有子节点信息,包括父节点名称、子节点的创建用户
进行映射替换时,Name Resolver的决策就比较难
决策过程进入子查询后,遇到2个对象。对于t.ParentName,子查询的select列表指定了别名,所以不应当替换。对于t.CreateBy、t.OrgCode这两个,在子查询中得进行猜测。首先子查询select列表中明确指定的字段里找不到这两个,所以得考察未明确指定列名的地方,只发现一个c.*,所以确定t.CreateBy、t.OrgCode这两个属性一定来自c.*,根据别名c找到Org as c中的Org对象,这两个属性是需要替换为自段名的。
from User a
inner join(
select c.*,p.OrgName as ParentName from Org p,Org as c
where c.ParentId=p.OrgId
) t on t.CreateBy=a.UserId
where t.ParentName like ?parent
order by t.OrgCode
结果:
from Sys_User a
inner join(
select c.*,p.Org_Name as ParentName from Sys_Org p,Sys_Org as c
where c.Parent_ID=p.Org_Id
) t on t.Create_By=a.Usr_Id
where t.ParentName like ?parent
order by t.Org_Code
完全从语句中确定对象-别名、属性-别名的关系,是不可能的,例如上面case 4中,如果在子查询的select列表里面发现两个*,该如何决策?
方法1: 在语法上做限制,使得通过OQL语句可以明确确定这种关系
方法2: 搜索O-R映射的元数据,进一步分析确认。这一方面要求在应用启动时对所有映射元数据有个整体加载的过程(类似Hibernate的SessionFactory创建时的编译处理),另一方面不同对象上同名属性、不同命名空间下的同名对象,仍然不可避免出现这种问题
方法3: 留下这个空间,交由Client端灵活运用。存在这种问题的地方必须明确指定出选择列表
从OQL语句里面搜索,试图确定对象、属性、别名之间的关系,这一职责赋给Name Resolver
维护映射信息,确定对象、属性应当映射到哪些表、自段,怎样映射,这一职责由Mapping Resolver/Manager承担
Name Resolver可以准确做出判断时,告诉Mapping Resolver进行精确的映射处理。当Name Resolver无法决策时,同样将接力棒交给Mapping Resolver,这时Mapping Resolver可以采取一次模糊搜索。例如在一个ObjectQuery范围里面,搜索Attach到这个ObjectQuery的所有Type映射信息(要求用户显示调用ObjectQuery.Attach(Type type, string name)这样的方法,避免对所有元数据的整体加载);或者加载所有映射元数据,从整个映射元数据中模糊搜索(名字有冲突时误判的可能性比较大,让用户显示Attach将缩小范围,有利于冲突的解决)。
ObjectQuery可以返回实体对象集合,或者返回一个IList<object>,或者DataTable。NHibernate选择返回IList<object>倒是可以省却一件事情,因为如果返回DataTable,对每个返回字段,需要有个名字对应,而不光是索引访问。上面看到,执行查询的时候,属姓名已经被替换为字段名,如果就这样返回DataTable,提供的这个功能就别扭了。首先查询语句里面写的是对象、属性名,而返回的DataTable中却是数据库字段名,使用这个DataTable的时候还是用数据库字段名访问?
所以如果选择返回DataTable,最好的方式是,Mapping Resolver将语句中的对象、属性替换为数据库的表名、字段名,这样才能执行这个SQL查询。但对于select列表,还得以别名、属性名方式返回,尤其是对于select a.*, b.*这样的情况,Name Resolver需要找出a, b具体是什么对象,由Mapping Resolver找出这些对象有哪些属性名,考虑到子查询等各种情况,情况很复杂。
所以简单的选择,还是返回IList<object>。
更复杂的情况,就是实体间的关联关系,体现在OQL中,同样要求Name Resolver与Mapping Resolver之间的协同工作。
结果:
Name Resolver与Mapping Resolver之间的协同比较多,从交互机制上看关联关系比较强;但它们拥有完全不同的专业知识,在不同的领域上工作,所以要求良好的分离。
相关推荐
在IT领域,特别是在服务导向架构(SOA)中,OQL(Object Query Language)是一种专门用于查询对象数据的语言,类似于SQL在关系数据库中的作用。本教程将深入探讨OQL的基本概念、语法和应用,帮助你更好地理解和运用...
在描述中提到,OQL使用类名、属性名来替代SQL中的表名、列名,以此表达查询概念,并且查询结果以表格形式返回。 OQL的样例样式如下: ```plaintext select A.DocNo, month(A.ActualCompleteDate), A.Department....
OQL.NET 对象查询语言具有良好的设计,无需安装插件,您就能在 IDE 中编写 OQL 时获得严谨而正确的上下文帮助。OQL.NET 对象查询语言能一步一步地引导用户写出正确的、具有兼容性的数据库查询语句。 OQL.NET 是...
NObject O/R Mapping 框架包含了 OQL.NET,一套基于 C# 和 VB.NET 等原生 .NET 语言的强类型对象查询语言 (OQL, Object Query Language) 使您甚至不需要写一行 SQL 语句。 ??NObject O/R Mapping 框架能帮您减少 30...
oql2json-从Netcool ITNM OQL ANTLR生成的转换器插入JSON 是一个网络建模软件套件。 它使用内部对象查询语言(OQL)数据库,该数据库具有类似SQL的语法,本机支持嵌套数组和哈希作为数据类型。 oql2json主要是一种...
Macrobject NObject 是一套用于 .NET 平台的 O/R Mapping (Object-Relation Mapping,对象关系映射) 框架。 ??NObject 支持多种数据库,完全对用户透明,切换数据库无需更改代码。NObject 同时提供了 XObject XML...
实体对象在 Spring Data JPA 中通常通过注解进行定义,如 `@Entity` 标记实体类,`@Table` 指定对应的数据库表,`@Id` 标识主键,以及其他字段级注解如 `@Column` 等。DAO(数据访问对象)接口则可以简单地声明为 ...
- **实体(Entities)**: OOA中的类转换为ER模型中的实体,每个实体代表数据库中的一张表。 - **属性映射(Attribute Mapping)**: 对象的属性成为实体的字段。 - **关系映射(Relationship Mapping)**: 关系...
OQL(Object Query Language)是一种面向对象的查询语言,用于从UAP的数据模型中检索数据。此外,还可以自定义函数扩展OQL的功能。 **2. 权限系统举例** 通过OQL可以实现精细化的权限控制,例如只允许用户查看或...
- **对象查询**:支持使用对象查询语言(如OQL)进行高效查询。 - **对象主键**:为每个对象分配唯一的标识符,类似于关系数据库中的主键。 - **事务支持**:保证数据操作的一致性和隔离性。 - **XML支持**:能够...
- **性能问题**:ClassView中的OQL转换功能可能速度较慢,建议在UBF中进行转换以提高效率。 - **安全性**:在部署ClassView时,需要注意Web服务器的安全设置,避免未经授权的访问。 - **技术支持**:如果遇到任何...
OQL 语言是 Mendix 中的一种查询语言,用于查询数据。学习者需要了解如何使用 OQL 语言来查询数据。 实践项目 在 Mendix 中级培训中,学习者需要完成一个实践项目,使用 Mendix 构建一个 tpm 软件。学习者需要了解...
这种引用类型允许在查询中直接访问引用对象的属性,如theater->name和theater->address。 在操纵新数据类型的例子中,我们看到如何使用OQL来处理这些复杂数据。例如,查询可以寻找包含特定图像特征的帧并返回相关...
在控制台中,你可以执行各种Arthas命令,如`asm`, `oql`, `watch`, `tt`, `trace`, `jad`等,帮助你动态查看类、方法、变量的状态,进行条件断点、表达式计算,甚至修改运行时代码。 Arthas的`asm`命令可以查看类的...
Android开源数据库框架db4o是一个强大的对象数据库管理系统,专为Java和.NET平台设计,但在Android环境中也有广泛的应用。db4o提供了一种直接在内存或磁盘上存储对象的方式,无需传统的关系型数据库映射,这使得开发...
4、同样在 OQL 中,a.p 表示如果 a 是某类的对象,p 表示联系,则 a.p 表示通过 p 与 a 相连的对象或对象的聚集,这通常涉及关联或连接操作。 5、E/R 图(实体-关系图)是数据库设计中用于描述实体及其相互关系的...
书中可能会讲解OQL如何表达对象的概念,如类、继承、封装和多态性,并演示如何使用OQL进行对象的查询和操作。 随着技术的发展,作者删除了过时的内容,加入了面向对象数据库的新技术,这使得教材保持了与时俱进的...
4. **OQL(Object Query Language)**:可以编写查询语句,深入探究堆内存中的特定对象或关系。 在我们的"AndroidHelloWorld" Demo中,我们可以模拟一些常见的内存问题,例如: - 长期保持静态变量引用导致的内存...