JDO 2.0查询语言的特点及功能

查询语言的改进是JDO2.0规范中的重要环节,本文从较高的层面阐述JDO2.0所提供的一些新功能。由于JDO2.0规范还未进入公开草案状态,目前还没有任何内容敲定下来,一切都还可能面临变化。不过,JDO2.0将会很快进入最后阶段,而这里提到的查询特性是JDO2.0专家组(译者注:David Jordan就是专家组重要成员)花费时间最多,并且相对来说最为稳定。因此,我有足够理由相信,最终规范与这里的描述将会基本一致。

如果各位读者觉得本文遗漏了某些重要的特性,建议立即到JDO论坛(http://www.jdocentral.com/forums/index.php?showforum=10)去提出并讨论。这里我们需要感谢JDO2.0规范领导人Craig Russell授权给我公开这些JDO2.0查询语言的新特性。

查询结果

我们首先从最深入的改进开始介绍。在JDO1.0中,查询结果总是你所指定的类的实例集合。考虑下面的UML类图,它表达了A、B、C、D四个类及之间的关系:

你可以创建一个对A类的查询,通过contains()引用到B类,再通过又一层contains()引用到C类,最后再使用一个“.”操作符引用到D类。但最终返回的集合中只会包含A类的对象实例,如果要从结果中获得其它类,就必须通过A类的引用来逐个获取相关的其它类对象。如果你的查询条件里面包含了B、C或D类的约束,那么在结果集中通过A类对象引用其它类对象时,必须重新将这些约束在Java代码中重复一遍,也就是说,你不得不在Java和JDOQL中重复声明限制条件。再者,你可能只关心满足查询条件的D类对象,而不希望中间的B、C类对象被JDO底层创建从而节省内存或相关资源。

在JDO2.0中,你再也不受缚于这些限制了。你可以返回:

数据类(PersistentCapable)的一个或多个字段

候选类以外的其它类对象

统计数据

这意味着你可以返回A、B、C、D类对象,或者它们的某些字段,或者二者的混和结果。你还可以计算类似min或max之类的统计结果。基本上,你想返回什么结果都可以。

当你创建一个查询时,你可以指定一个“结果定义(Result Specification)”来指定返回什么样的内容。它是一个包含一个或多个以逗号分隔的“结果表达式(Result Expression)”。结果表达式可以是:

this关键字,表示返回候选类的对象实例。这与JDO1.0是一样的字段,标明候选类或引用类的某个字段的值,如 address.street.name 字段表达式,代表对多个字段进行JDO预定义的几种算术运算而获得的结果变量,代表查询条件中出现的某个中间变量引用表达式,也就是JDO1.0中的通过“.”操作符进行的对象之间的引用 统计表达式通过对以上这几种结果表达式的组合运用,你可以获得任何你想要的结果。

JDO2.0支持下面的统计函数:

count(表达式),表达式可以是this

sum(数字型字段表达式),“数字型字段表达式”可以是通过字段或字段的运算得到的数字型的结果

min(数字型字段表达式)

max(数字型字段表达式)

avg(数字型字段表达式)

对查询结果的指定是通过下面的API:

void javax.jdo.Query.setResult(String result)

如果你不调用这个方法,或者参数是null,则返回候选类的对象实例(相当于设置为“this”),即JDO1.0的返回结果。如果你只指定了唯一结果表达式,则返回集合的元素类型与该结果的类型一致。另外,在默认方式下,如果指定了多个结果表达式,则返回的集合元素类型将是 Object[]。

你可以在结果定义字符串的开头标上distinct来保证结果不会重复。而如果结果定义串中包含好几个表达式,那么distinct可以保证结果集中不会有重复的数据组。

每个结果表达式可以指定一个名称,对于简单的字段,系统会默认以该字段的名称作为结果中该项的名称。对复杂的表达式,你可以使用下面的语法指定名称:

result_expression as name  

名称的使用可以让结果中的该项作为结果类中的一个属性来进行设置和使用。你可以指定一个结果类(result class),用来返回查询结果。如果查询结果是一个单值,结果类可以是任何JDO支持的类(Integer, Double, String, BigInteger, BigDecimal, java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp)。Query中设置结果类的方法是:

void setResultClass(Class resultClass)

如果查询结果包含多个结果表达式,你可以定义一个结果类来保留结果中的各项数据,这个类必须有一个无参数的构造器。此外,每个结果表达式必须对应此类中的一个属性,不论是一个public的字段,还是一个public的setXxx()方法,并且这种直接的或bean风格的属性名称与查询结果中各项结果表达式的名称保持一致。

时间: 2024-12-01 15:26:15

JDO 2.0查询语言的特点及功能的相关文章

Java数据对象JDO 2.0查询语言的特点_JSP编程

    查询语言的改进是JDO2.0规范中的重要环节,本文从较高的层面阐述JDO2.0所提供的一些新功能.由于JDO2.0规范还未进入公开草案状态,目前还没有任何内容敲定下来,一切都还可能面临变化.不过,JDO2.0将会很快进入最后阶段,而这里提到的查询特性是JDO2.0专家组(译者注:David Jordan就是专家组重要成员)花费时间最多,并且相对来说最为稳定.因此,我有足够理由相信,最终规范与这里的描述将会基本一致. 如果各位读者觉得本文遗漏了某些重要的特性,建议立即到JDO论坛(http

JDO 2.0查询语言的特点_JSP编程

查询语言的改进是JDO2.0规范中的重要环节,本文从较高的层面阐述JDO2.0所提供的一些新功能.由于JDO2.0规范还未进入公开草案状态,目前还没有任何内容敲定下来,一切都还可能面临变化.不过,JDO2.0将会很快进入最后阶段,而这里提到的查询特性是JDO2.0专家组(译者注:David Jordan就是专家组重要成员)花费时间最多,并且相对来说最为稳定.因此,我有足够理由相信,最终规范与这里的描述将会基本一致. 如果各位读者觉得本文遗漏了某些重要的特性,建议立即到JDO论坛(http://w

JDO 2.0查询语言的特点

查询语言的改进是JDO2.0规范中的重要环节,本文从较高的层面阐述JDO2.0所提供的一些新功能.由于JDO2.0规范还未进入公开草案状态,目前还没有任何内容敲定下来,一切都还可能面临变化.不过,JDO2.0将会很快进入最后阶段,而这里提到的查询特性是JDO2.0专家组(译者注:David Jordan就是专家组重要成员)花费时间最多,并且相对来说最为稳定.因此,我有足够理由相信,最终规范与这里的描述将会基本一致. 如果各位读者觉得本文遗漏了某些重要的特性,建议立即到JDO论坛(http://w

Java数据对象JDO 2.0查询语言的特点

查询语言的改进是JDO2.0规范中的重要环节,本文从较高的层面阐述JDO2.0所提供的一些新功能.由于JDO2.0规范还未进入公开草案状态,目前还没有任何内容敲定下来,一切都还可能面临变化.不过,JDO2.0将会很快进入最后阶段,而这里提到的查询特性是JDO2.0专家组(译者注:David Jordan就是专家组重要成员)花费时间最多,并且相对来说最为稳定.因此,我有足够理由相信,最终规范与这里的描述将会基本一致. 如果各位读者觉得本文遗漏了某些重要的特性,建议立即到JDO论坛(http://w

ADO.NET 2.0 DataSet和DataTable 新功能新特性

ado ADO.NET 2.0 Dataset和Datatable 新功能新特性 1.新的索引引擎更快的执行效率   下面这段代码在2003中需要157秒,在2005中只要11秒就可以完成: DataSet ds = new DataSet(); ds.Tables.Add("BigTable");ds.Tables[0].Columns.Add("ID", Type.GetType("System.Int32"));ds.Tables[0].C

ASP.NET 2.0 中的异步页功能应用

asp.net|异步 下载本文源代码:WickedCode0510.exe ASP.NET 2.0 提供了大量新功能,其中包括声明性数据绑定和母版页,成员和角色管理服务等.但我认为最棒的功能是异步页,接下来让我告诉您其中的原因. 当 ASP.NET 接收针对页的请求时,它从线程池中提取一个线程并将请求分配给该线程.一个普通的(或同步的)页在该请求期间保留线程,从而防止该线程用于处理其他请求.如果一个同步请求成为 I/O 绑定(例如,如果它调用一个远程 Web 服务或查询一个远程数据库,并等待调用

体验ASP.NET 2.0 中的异步页功能

asp.net|异步 (一).简单介绍实现原理 下图左为未使用异步页功能执行过程(Asp.net 1.0通常情况), 下图右为使用了异步页执行过程(Asp.net 2.0新增特性). (Asp.net 1.0一般处理过程) (使用Asp.net 2.0新增特性异步页功能处理过程) 从左图中看出,在一个页面整个请求的过程中, 一个线程始终为同一个页面的请求服务. 而从右图可以看出,在一个页面请求的过程中, 可以由不同的线程为本页面请求服务. 显然,采用图中方式在客户端请求数量多时,网站整体效率较高

ASP.NET 2.0 中改进的缓存功能

asp.net|缓存 Stephen Walther      Microsoft Corporation      适用于:      Microsoft ASP.NET 2.0      Microsoft ASP.NET Framework      Microsoft SQL Server      Microsoft Visual Studio .NET      摘要:本文中,Stephen Walther 将重点介绍 ASP.NET 2.0 中新增的缓存功能,以及如何使用这些新功能

ASP.NET 2.0中的异步页功能应用

ASP.NET 2.0 提供了大量新功能,其中包括声明性数据绑定和母版页,成员 和角色管理服务等.但我认为最棒的功能是异步页,接下来让我告诉您其中的原 因. 当 ASP.NET 接收针对页的请求时,它从线程池中提取一个线程并将请求分配 给该线程.一个普通的(或同步的)页在该请求期间保留线程,从而防止该线程 用于处理其他请求.如果一个同步请求成为 I/O 绑定(例如,如果它调用一个 远程 Web 服务或查询一个远程数据库,并等待调用返回),那么分配给该请求 的线程在调用返回之前处于挂起状态.这影响