亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

JDO 2.0 的查詢語言新特性

2019-11-18 12:38:23
字體:
來源:轉載
供稿:網友

  查詢語言的改進是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風格的屬性名稱與查詢結果中各項結果表達式的名稱保持一致。
  
  組操作(Grouping)
  統計功能可用于一個分組操作中。JDO2.0提供類似SQL中的GROUP BY和HAVING子句。Query方法:
  
  void setGrouping(String groupSpec)
  
  用于指定分組的原則。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”的過濾條件。
  
  批量刪除(Deletion by Query)
  在JDO1.0中,要刪除一個對象,必須先將其載入內存,再刪除,然而很多情況下,你在刪除之前并不需要訪問該對象,這樣的做法比較低效。在JDO2.0中,提供了Query的幾個方法來刪除符合查詢條件的一組對象:
  
  Object deletePersistentAll(Object[] parameters)  Object deletePersistentAll(Map parameters)  Object deletePersistentAll()
  此查詢結果的對象會被全部從數據庫刪除。這些方法返回被刪除對象的集合。你的程序可以決定是否需要對被刪除的對象逐個訪問。假如你不訪問這些對象,Query執行的性能將不會受到任何影響,換句話說,這些對象將不會在內存中生成。
  
  廠商擴展的查詢特性
  JDO廠商可以給JDOQL

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲japanese制服美女| 日韩精品中文字幕有码专区| 日产日韩在线亚洲欧美| 亚洲欧美在线看| 欧美一区三区三区高中清蜜桃| 欧美高清视频一区二区| 亚洲精品免费av| 久久久免费精品视频| 欧美日韩国产一区二区| www.精品av.com| 色综合久久久久久中文网| 亚洲精品99久久久久中文字幕| 国产精品专区一| 国产丝袜一区二区三区免费视频| 欧美极品在线视频| 91精品国产91久久久久久不卡| 欧美巨大黑人极品精男| 国产精品91久久| 色777狠狠综合秋免鲁丝| 日韩中文字幕精品视频| 91精品国产777在线观看| 日本精品一区二区三区在线播放视频| 国产精品白嫩初高中害羞小美女| 欧美极品少妇xxxxⅹ裸体艺术| 亚洲成av人片在线观看香蕉| 亚洲欧美制服综合另类| 精品二区三区线观看| 日韩中文字幕亚洲| 91免费国产网站| 日韩av电影免费观看高清| 亚洲精品小视频在线观看| 久久久久久久久久久网站| 欧美激情一区二区三区成人| 亚洲天堂av电影| 久久久久久久久久久免费精品| 国内精品小视频在线观看| 亚洲最新av在线| 欧美极品美女视频网站在线观看免费| 伊人伊成久久人综合网站| 亚洲天堂av电影| 久久久www成人免费精品张筱雨| 精品视频久久久久久久| 欧美激情视频一区二区| 2025国产精品视频| 久久成人在线视频| 亚洲国产毛片完整版| 亚洲免费视频在线观看| 久久视频精品在线| 97精品视频在线观看| 91精品久久久久久久久久另类| 欧美一级免费视频| 精品一区二区电影| 久久久国产精品一区| 亚洲高清av在线| 日韩av网站导航| 国产日韩精品综合网站| 日韩电影免费观看在线观看| 日韩中文字幕在线看| 欧美视频一区二区三区…| 亚洲国产欧美一区| 国产视频精品自拍| 久久综合伊人77777| 伦伦影院午夜日韩欧美限制| 亚洲国产天堂网精品网站| 国产欧美一区二区三区久久人妖| 91影院在线免费观看视频| 一区二区三欧美| 九九热这里只有在线精品视| 欧美xxxx18性欧美| 国产91|九色| 中文字幕亚洲国产| 欧美日本高清视频| 国产精品久久久久久网站| 秋霞av国产精品一区| 亚洲欧美成人在线| 精品国产一区二区三区久久狼黑人| 国产欧美一区二区三区四区| 久久精品视频99| 91av在线影院| 精品免费在线视频| 亚洲黄在线观看| 麻豆一区二区在线观看| 亚洲欧美日韩天堂一区二区| 激情成人在线视频| 日韩中文字幕在线| 国产一区二区三区久久精品| 国产v综合ⅴ日韩v欧美大片| 日韩h在线观看| 国产免费成人av| 亚洲男人的天堂网站| 国内精品久久久久久久久| 亚洲成人久久久久| 国产精品第一视频| 欧美大片免费观看| 亚洲女人被黑人巨大进入| 国产精品福利在线观看网址| 欧美高跟鞋交xxxxhd| 欧美激情亚洲另类| 亚洲欧美成人在线| 欧洲美女7788成人免费视频| 粗暴蹂躏中文一区二区三区| 国产精品一区二区三区免费视频| 欧美亚洲国产视频小说| 亚洲精品二三区| 国产91精品视频在线观看| 少妇高潮久久久久久潘金莲| 欧美另类老女人| 亚洲xxx自由成熟| 久久伊人免费视频| 亚洲老头老太hd| 欧美日韩亚洲精品内裤| 日韩av毛片网| 91久久国产精品| 国产精品久久久久久久久久东京| 亚洲国产精品久久久久久| 91精品久久久久久久久久| 欧美在线视频观看| 欧美日韩中文字幕日韩欧美| 欧美肥臀大乳一区二区免费视频| 欧美日韩一区二区在线| 日韩在线视频中文字幕| 成人网在线免费看| 95av在线视频| 国产一级揄自揄精品视频| 成人亚洲欧美一区二区三区| 精品国产一区二区三区久久久| 最新日韩中文字幕| 欧美激情第一页xxx| 97在线看福利| 成人精品视频99在线观看免费| 日本午夜精品理论片a级appf发布| 精品一区二区三区电影| 欧美精品亚州精品| 成人免费福利视频| 亚洲国产精品人久久电影| 国产精品白丝jk喷水视频一区| 热re99久久精品国产66热| 日韩av不卡电影| 自拍偷拍亚洲区| 久久久久久伊人| 综合136福利视频在线| 日韩欧美精品在线观看| 日韩一区二区欧美| 97在线视频精品| 亚洲美女性视频| 国产精彩精品视频| 国产在线播放91| 国产激情999| 精品一区二区电影| 456亚洲影院| 国产69精品久久久| 亚洲va欧美va在线观看| 国产精品第一页在线| 欧美极品美女视频网站在线观看免费| 91免费看视频.| 在线日韩av观看| 欧美激情欧美狂野欧美精品| 亚洲精品色婷婷福利天堂| 久久精品亚洲94久久精品| 亚洲日本欧美日韩高观看| 日韩精品有码在线观看| 国产精品亚洲美女av网站| 欧美日韩国产中字| 中文字幕av日韩|