国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

JDO 2.0 的查詢語(yǔ)言新特性

2019-11-18 12:38:23
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  查詢語(yǔ)言的改進(jìn)是JDO2.0規(guī)范中的重要環(huán)節(jié),本文從較高的層面闡述JDO2.0所提供的一些新功能。由于JDO2.0規(guī)范還未進(jìn)入公開(kāi)草案狀態(tài),目前還沒(méi)有任何內(nèi)容敲定下來(lái),一切都還可能面臨變化。不過(guò),JDO2.0將會(huì)很快進(jìn)入最后階段,而這里提到的查詢特性是JDO2.0專家組(譯者注:David Jordan就是專家組重要成員)花費(fèi)時(shí)間最多,并且相對(duì)來(lái)說(shuō)最為穩(wěn)定。因此,我有足夠理由相信,最終規(guī)范與這里的描述將會(huì)基本一致。
  
  假如各位讀者覺(jué)得本文遺漏了某些重要的特性,建議立即到JDO論壇(http://www.jdocentral.com/forums/index.php?showforum=10)去提出并討論。這里我們需要感謝JDO2.0規(guī)范領(lǐng)導(dǎo)人Craig Russell授權(quán)給我公開(kāi)這些JDO2.0查詢語(yǔ)言的新特性。
  
  查詢結(jié)果
  我們首先從最深入的改進(jìn)開(kāi)始介紹。在JDO1.0中,查詢結(jié)果總是你所指定的類的實(shí)例集合。考慮下面的UML類圖,它表達(dá)了A、B、C、D四個(gè)類及之間的關(guān)系:
  
JDO 2.0 的查詢語(yǔ)言新特性

  你可以創(chuàng)建一個(gè)對(duì)A類的查詢,通過(guò)contains()引用到B類,再通過(guò)又一層contains()引用到C類,最后再使用一個(gè)“.”操作符引用到D類。但最終返回的集合中只會(huì)包含A類的對(duì)象實(shí)例,假如要從結(jié)果中獲得其它類,就必須通過(guò)A類的引用來(lái)逐個(gè)獲取相關(guān)的其它類對(duì)象。假如你的查詢條件里面包含了B、C或D類的約束,那么在結(jié)果集中通過(guò)A類對(duì)象引用其它類對(duì)象時(shí),必須重新將這些約束在java代碼中重復(fù)一遍,也就是說(shuō),你不得不在Java和JDOQL中重復(fù)聲明限制條件。再者,你可能只關(guān)心滿足查詢條件的D類對(duì)象,而不希望中間的B、C類對(duì)象被JDO底層創(chuàng)建從而節(jié)省內(nèi)存或相關(guān)資源。
  
  在JDO2.0中,你再也不受縛于這些限制了。你可以返回:
  
  數(shù)據(jù)類(PersistentCapable)的一個(gè)或多個(gè)字段
  候選類以外的其它類對(duì)象
  統(tǒng)計(jì)數(shù)據(jù)
  這意味著你可以返回A、B、C、D類對(duì)象,或者它們的某些字段,或者二者的混和結(jié)果。你還可以計(jì)算類似min或max之類的統(tǒng)計(jì)結(jié)果。基本上,你想返回什么結(jié)果都可以。
  
  當(dāng)你創(chuàng)建一個(gè)查詢時(shí),你可以指定一個(gè)“結(jié)果定義(Result Specification)”來(lái)指定返回什么樣的內(nèi)容。它是一個(gè)包含一個(gè)或多個(gè)以逗號(hào)分隔的“結(jié)果表達(dá)式(Result EXPRession)”。結(jié)果表達(dá)式可以是:
  
  this要害字,表示返回候選類的對(duì)象實(shí)例。這與JDO1.0是一樣的
  字段,標(biāo)明候選類或引用類的某個(gè)字段的值,如 address.street.name
  字段表達(dá)式,代表對(duì)多個(gè)字段進(jìn)行JDO預(yù)定義的幾種算術(shù)運(yùn)算而獲得的結(jié)果
  變量,代表查詢條件中出現(xiàn)的某個(gè)中間變量
  引用表達(dá)式,也就是JDO1.0中的通過(guò)“.”操作符進(jìn)行的對(duì)象之間的引用
  統(tǒng)計(jì)表達(dá)式
  通過(guò)對(duì)以上這幾種結(jié)果表達(dá)式的組合運(yùn)用,你可以獲得任何你想要的結(jié)果。
  
  JDO2.0支持下面的統(tǒng)計(jì)函數(shù):
  
  count(表達(dá)式),表達(dá)式可以是this
  sum(數(shù)字型字段表達(dá)式),“數(shù)字型字段表達(dá)式”可以是通過(guò)字段或字段的運(yùn)算得到的數(shù)字型的結(jié)果
  min(數(shù)字型字段表達(dá)式)
  max(數(shù)字型字段表達(dá)式)
  avg(數(shù)字型字段表達(dá)式)
  對(duì)查詢結(jié)果的指定是通過(guò)下面的API:
  
  void javax.jdo.Query.setResult(String result)
  假如你不調(diào)用這個(gè)方法,或者參數(shù)是null,則返回候選類的對(duì)象實(shí)例(相當(dāng)于設(shè)置為“this”),即JDO1.0的返回結(jié)果。假如你只指定了唯一結(jié)果表達(dá)式,則返回集合的元素類型與該結(jié)果的類型一致。另外,在默認(rèn)方式下,假如指定了多個(gè)結(jié)果表達(dá)式,則返回的集合元素類型將是 Object[]。
  
  你可以在結(jié)果定義字符串的開(kāi)頭標(biāo)上distinct來(lái)保證結(jié)果不會(huì)重復(fù)。而假如結(jié)果定義串中包含好幾個(gè)表達(dá)式,那么distinct可以保證結(jié)果集中不會(huì)有重復(fù)的數(shù)據(jù)組。
  
  每個(gè)結(jié)果表達(dá)式可以指定一個(gè)名稱,對(duì)于簡(jiǎn)單的字段,系統(tǒng)會(huì)默認(rèn)以該字段的名稱作為結(jié)果中該項(xiàng)的名稱。對(duì)復(fù)雜的表達(dá)式,你可以使用下面的語(yǔ)法指定名稱:
  
  result_expression as name
  
  名稱的使用可以讓結(jié)果中的該項(xiàng)作為結(jié)果類中的一個(gè)屬性來(lái)進(jìn)行設(shè)置和使用。你可以指定一個(gè)結(jié)果類(result class),用來(lái)返回查詢結(jié)果。假如查詢結(jié)果是一個(gè)單值,結(jié)果類可以是任何JDO支持的類(Integer, Double, String, BigInteger, BigDecimal, java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp)。Query中設(shè)置結(jié)果類的方法是:
  
  void setResultClass(Class resultClass)
  假如查詢結(jié)果包含多個(gè)結(jié)果表達(dá)式,你可以定義一個(gè)結(jié)果類來(lái)保留結(jié)果中的各項(xiàng)數(shù)據(jù),這個(gè)類必須有一個(gè)無(wú)參數(shù)的構(gòu)造器。此外,每個(gè)結(jié)果表達(dá)式必須對(duì)應(yīng)此類中的一個(gè)屬性,不論是一個(gè)public的字段,還是一個(gè)public的setXxx()方法,并且這種直接的或bean風(fēng)格的屬性名稱與查詢結(jié)果中各項(xiàng)結(jié)果表達(dá)式的名稱保持一致。
  
  組操作(Grouping)
  統(tǒng)計(jì)功能可用于一個(gè)分組操作中。JDO2.0提供類似SQL中的GROUP BY和HAVING子句。Query方法:
  
  void setGrouping(String groupSpec)
  
  用于指定分組的原則。groupSpec參數(shù)包含一個(gè)或多個(gè)以逗號(hào)分隔的分組表達(dá)式,還可以跟上一個(gè)以“having ”開(kāi)頭的過(guò)濾條件。調(diào)用此方法后,setResult()參數(shù)的每個(gè)結(jié)果表達(dá)式項(xiàng)必須是groupSpec中的一項(xiàng),或者是groupSpec中的一項(xiàng)或多項(xiàng)的運(yùn)算結(jié)果。所有g(shù)roupSpec項(xiàng)的值均相同的結(jié)果被歸在同一組中(同一條結(jié)果記錄)。having子句的過(guò)濾條件可以包含boolean結(jié)果的判定語(yǔ)句或者是對(duì)分組表達(dá)式的統(tǒng)計(jì)運(yùn)算。與SQL一樣,having子句用于對(duì)分組后的結(jié)果集進(jìn)行條件過(guò)濾。
  
  唯一性(Uniqueness)
  很多人一直希奇為什么Query的執(zhí)行(execute)結(jié)果是一個(gè)Object類型的對(duì)象,因?yàn)檫@樣給開(kāi)發(fā)人員造成必須手工強(qiáng)制將結(jié)果轉(zhuǎn)換成Collection的不便。JDO1.0中查詢結(jié)果一般有多個(gè)元素,但JDO專家組計(jì)劃在JDO2.0中加入對(duì)返回單值結(jié)果的查詢的支持,于是將Query的執(zhí)行結(jié)果定義為Object類型。
  
  你有時(shí)會(huì)執(zhí)行一個(gè)你確定結(jié)果只會(huì)有一條的查詢(比如統(tǒng)計(jì)總數(shù)或者按具有唯一索引的會(huì)員帳號(hào)查找對(duì)象等等),在JDO2.0中,你可以調(diào)用Query方法來(lái)聲明:
  
  void setUnique(boolean unique)
  當(dāng)你傳入“true”后,Query執(zhí)行的結(jié)果將是一個(gè)單獨(dú)的值對(duì)象,假如無(wú)任何結(jié)果返回,則結(jié)果是null。假如JDO發(fā)現(xiàn)查詢結(jié)果返回了多條記錄,則會(huì)扔出一個(gè)異常。
  
  限制返回結(jié)果的大小
  設(shè)計(jì)用戶界面的時(shí)候,我們經(jīng)常會(huì)顯示結(jié)果集的某一部分子集(比如分頁(yè)顯示或只顯示前十條之類)。為了性能和效率,你多半會(huì)需要限制返回結(jié)果的范圍。Query的方法可以完成這一點(diǎn):
  
  void setRange(int fromInclusive, int toExclusive)
  該方法返回的結(jié)果集只包含原結(jié)果集的第fromInclusive條到第toExclusive-1條。
  
  新的過(guò)濾條件操作符
  一些新的操作符被加到JDOQL中,以便執(zhí)行針對(duì)引用、Map、字符串和數(shù)字的操作。instanceof操作符返回一個(gè)boolean值,可以讓你過(guò)濾某個(gè)指定類的對(duì)象;同樣返回boolean值的containsKey(Object)函數(shù)和containsValue(Object)用于訪問(wèn)Map元素。
  
  字符串處理方面加入了很多函數(shù),toLowerCase()和toUpperCase()分別完成大小寫轉(zhuǎn)換,另外還有下列函數(shù)用于查找子串位置和獲得子串:
  
  int indexOf(String)
  int indexOf(String, int)  String substring(int)  String substring(int,int)
  另外,String的方法:
  
  boolean matches(String pattern)
  用于執(zhí)行正則式匹配。目前只能提供有限的匹配功能?!?”和“.*”可表示通配符,而“(?i)”表示匹配不區(qū)分大小寫。
  
  對(duì)數(shù)字型的字段,JDO2.0增加了兩個(gè)函數(shù):
  
  Math.abs(numeric)  Math.sqrt(numeric)
  
  預(yù)定義查詢(Named Queries)
  你可以在JDO描述符(metadata)中聲明常用的JDOQL查詢語(yǔ)句,這樣就不用將查詢嵌入到Java源代碼中。這樣可以提供一些靈活性,比如將查詢語(yǔ)句寫到一個(gè)配置好的文本文件中,而需要修改時(shí)可以直接改該文件,而不用更改Java源碼。描述符中的每個(gè)查詢都有一個(gè)名字,而要執(zhí)行某個(gè)查詢時(shí),可以使用下面的方法來(lái)創(chuàng)建查詢:
  
  Query newNamedQuery(Class cls, String queryName)
  
  JDO將會(huì)搜索描述符來(lái)找到對(duì)應(yīng)的預(yù)定義查詢語(yǔ)句并生成相應(yīng)的Query對(duì)象。
  
  訪問(wèn)靜態(tài)字段(static fields)
  你將可以在JDOQL中訪問(wèn)數(shù)據(jù)類中以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”的過(guò)濾條件。
  
  批量刪除(Deletion by Query)
  在JDO1.0中,要?jiǎng)h除一個(gè)對(duì)象,必須先將其載入內(nèi)存,再刪除,然而很多情況下,你在刪除之前并不需要訪問(wèn)該對(duì)象,這樣的做法比較低效。在JDO2.0中,提供了Query的幾個(gè)方法來(lái)刪除符合查詢條件的一組對(duì)象:
  
  Object deletePersistentAll(Object[] parameters)  Object deletePersistentAll(Map parameters)  Object deletePersistentAll()
  此查詢結(jié)果的對(duì)象會(huì)被全部從數(shù)據(jù)庫(kù)刪除。這些方法返回被刪除對(duì)象的集合。你的程序可以決定是否需要對(duì)被刪除的對(duì)象逐個(gè)訪問(wèn)。假如你不訪問(wèn)這些對(duì)象,Query執(zhí)行的性能將不會(huì)受到任何影響,換句話說(shuō),這些對(duì)象將不會(huì)在內(nèi)存中生成。
  
  廠商擴(kuò)展的查詢特性
  JDO廠商可以給JDOQL

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 盘锦市| 内江市| 凤山县| 望城县| 古蔺县| 彰化县| 太湖县| 望谟县| 馆陶县| 衡水市| 宁河县| 郁南县| 武鸣县| 赤城县| 密云县| 临颍县| 敦化市| 精河县| 高安市| 九龙坡区| 绥化市| 上栗县| 潜山县| 辽阳市| 常熟市| 白玉县| 应城市| 鄂托克前旗| 讷河市| 淮安市| 山阳县| 大悟县| 浪卡子县| 东乡县| 罗甸县| 建平县| 突泉县| 杨浦区| 嘉定区| 容城县| 苏州市|