当前位置:天才代写 > tutorial > JAVA 教程 > JDO 2.0查询语言的特点及成果

JDO 2.0查询语言的特点及成果

2017-11-11 08:00 星期六 所属: JAVA 教程 浏览:489

副标题#e#

查询语言的改造是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四个类及之间的干系:

JDO 2.0查询语言的特点及成就

你可以建设一个对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气势气魄的属性名称与查询功效中各项功效表达式的名称保持一致。


#p#副标题#e#

组操纵(Grouping)

统计成果可用于一个分组操纵中。JDO2.0提供雷同SQL中的GROUP BY和HAVING子句。Query要领:

void setGrouping(String groupSpec)

#p#分页标题#e#

用于指定分组的原则。groupSpec参数包括一个或多个以逗号脱离的分组表达式,还可以跟上一个以“having ”开头的过滤条件。挪用此要领后,setResult()参数的每个功效表达式项必需是groupSpec中的一项,可能是groupSpec中的一项或多项的运算功效。所有groupSpec项的值均沟通的功效被归在同一组中(同一条功效记录)。having子句的过滤条件可以包括boolean功效的判定语句可能是对分组表达式的统计运算。与SQL一样,having子句用于对分组后的功效集举办条件过滤。

独一性(Uniqueness)

许多人一直奇怪为什么Query的执行(execute)功效是一个Object范例的工具,因为这样给开拓人员造成必需手工强制将功效转换成Collection的未便。JDO1.0中查询功效一般有多个元素,但JDO专家组打算在JDO2.0中插手对返回单值功效的查询的支持,于是将Query的执行功效界说为Object范例。

你有时会执行一个你确定功效只会有一条的查询(好比统计总数可能按具有独一索引的会员帐号查找工具等等),在JDO2.0中,你可以挪用Query要领来声明:

void setUnique(boolean unique)

当你传入“true”后,Query执行的功效将是一个单独的值工具,假如无任何功效返回,则功效是null。假如JDO发明查询功效返回了多笔记录,则会扔出一个异常。

限制返回功效的巨细

设计用户界面的时候,我们经常会显示功效集的某一部门子集(好比分页显示或只显示前十条之类)。为了机能和效率,你多数会需要限制返回功效的范畴。Query的要领可以完成这一点:

void setRange(int fromInclusive, int toExclusive)

该要领返回的功效集只包括原功效集的第fromInclusive条到第toExclusive-1条。

新的过滤条件操纵符

一些新的操纵符被加到JDOQL中,以便执行针对引用、Map、字符串和数字的操纵。instanceof操纵符返回一个boolean值,可以让你过滤某个指定类的工具;同样返回boolean值的containsKey(Object)函数和containsValue(Object)用于会见Map元素。

字符串处理惩罚方面插手了许多函数,toLowerCase()和toUpperCase()别离完成巨细写转换,别的尚有下列函数用于查找子串位置和得到子串:

int indexOf(String)
int indexOf(String, int) String substring(int) String substring(int,int)

别的,String的要领:

boolean matches(String pattern)

用于执行正则式匹配。今朝只能提供有限的匹配成果。“.”和“.*”可暗示通配符,而“(?i)”暗示匹配不区分巨细写。

对数字型的字段,JDO2.0增加了两个函数:

Math.abs(numeric) Math.sqrt(numeric)

预界说查询(Named Queries)

你可以在JDO描写符(metadata)中声明常用的JDOQL查询语句,这样就不消将查询嵌入到Java源代码中。这样可以提供一些机动性,好比将查询语句写到一个设置好的文本文件中,而需要修改时可以直接改该文件,而不消变动Java源码。描写符中的每个查询都有一个名字,而要执行某个查询时,可以利用下面的要领来建设查询:

Query newNamedQuery(Class cls, String queryName)

JDO将会搜索描写符来找到对应的预界说查询语句并生成相应的Query工具。

会见静态字段(static fields)

你将可以在JDOQL中会见数据类中以public static final方法声明的常量。好比

public static final int FEMALE = 0;
public static final int MALE = 1;
public static final int UNKNOWN = 2;

而在查询中利用雷同“salary > 5000.0 && gender == MALE”的过滤条件。

#p#副标题#e#

批量删除(Deletion by Query)

在JDO1.0中,要删除一个工具,必需先将其载入内存,再删除,然而许多环境下,你在删除之前并不需要会见该工具,这样的做法较量低效。在JDO2.0中,提供了Query的几个要领来删除切合查询条件的一组工具:

Object deletePersistentAll(Object[] parameters) Object deletePersistentAll(Map parameters) Object deletePersistentAll()

此查询功效的工具会被全部从数据库删除。这些要领返回被删除工具的荟萃。你的措施可以抉择是否需要对被删除的工具逐个会见。假如你不会见这些工具,Query执行的机能将不会受到任何影响,换句话说,这些工具将不会在内存中生成。

厂商扩展的查询特性

#p#分页标题#e#

JDO厂商可以给JDOQL提供各类百般的非凡查询成果。每个厂商可以界说一组属于该厂商本身的扩展成果。假如你需要利用个中的成果,你需要将该厂商的扩展加到措施运行情况中。每个扩展有一个名字和一个可选的值。你可以单独配置每个扩展,可能一次性配置多个扩展。Query的下列要领用于配置厂商扩展特性:

void setExtensions(Map extensions) void addExtension(String key, Object value)

SQL直接会见

假如JDO2.0的查询成果不能满意需要,而且以下条件都满意:

你的应用运行在干系数据库上

你需要的查询有SQL语句可以实现

你知道从你的类模子到数据库的映射细节

你就可以建设一个SQL查询,要领是挪用PersistentManger的要领:

Query newQuery(String language, Object query)

每一个参数需要配置为“javax.jdo.query.SQL”,而query是一个详细的SQL语句。假如你的查询需要返回类的实例,则这个SQL语句必需返回该类的相应主键字段。利用直接的SQL时,JDOQL提供的函数将不能被利用,不然将会扔出异常JDOUserException,好比,你不能对该Query配置过滤条件字符串、排序声明或变量声明。利用SQL查询时,参数都是未指定范例的,在SQL语句中以“?”暗示,而且按呈现的顺序被绑定。

竣事语

列位读者已经看到,JDO2.0对查询语句增加了许多新的成果和特性,我认为个中的查询功效界说是最大的改造。正如我在文章开头说的,这一部门变革今朝来说是JDO2.0中最不变的部门,不会有大的变革。厂商可以开始提供许多这样的成果,不消思量专家组还在接头的JDO2.0其余部门将如何变革。

在JDO2.0提供尺度的工具/干系映射的前提下,这里描写的查询成果和一个用于多层布局的JDO应用的脱钩/挂钩(detach/attach)机制,将使JDO占领更多的市场。对这一点有深切体会的厂商将精心极力地争取率先推出不变、完整、高效的JDO2.0产物。JDO将是基于数据库存储和打点的应用开拓的首先API,开拓人员们将享受面向工具的模子设计和高效的数据存储打点系统。

 

    关键字:

天才代写-代写联系方式