查詢語言的改進是JDO2.0規范中的重要環節,本文從較高的層面闡述JDO2.0所提供的一些新功能。由于JDO2.0規范還未進入公開草案狀態,目前還沒有任何內容敲定下來,一切都還可能面臨變化。不過,JDO2.0將會很快進入最后階段,而這里提到的查詢特性是JDO2.0專家組(譯者注:David Jordan就是專家組重要成員)花費時間最多,并且相對來說最為穩定。因此,我有足夠理由相信,最終規范與這里的描述將會基本一致。 ![]() 你可以創建一個對A類的查詢,通過contains()引用到B類,再通過又一層contains()引用到C類,最后再使用一個“.”操作符引用到D類。但最終返回的集合中只會包含A類的對象實例,如果要從結果中獲得其它類,就必須通過A類的引用來逐個獲取相關的其它類對象。如果你的查詢條件里面包含了B、C或D類的約束,那么在結果集中通過A類對象引用其它類對象時,必須重新將這些約束在Java代碼中重復一遍,也就是說,你不得不在Java和JDOQL中重復聲明限制條件。再者,你可能只關心滿足查詢條件的D類對象,而不希望中間的B、C類對象被JDO底層創建從而節省內存或相關資源。
組操作(Grouping)
用于指定分組的原則。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方法來聲明:
當你傳入“true”后,Query執行的結果將是一個單獨的值對象,如果無任何結果返回,則結果是null。如果JDO發現查詢結果返回了多條記錄,則會扔出一個異常。 限制返回結果的大小 設計用戶界面的時候,我們常常會顯示結果集的某一部分子集(比如分頁顯示或只顯示前十條之類)。為了性能和效率,你多半會需要限制返回結果的范圍。Query的方法可以完成這一點:
該方法返回的結果集只包含原結果集的第fromInclusive條到第toExclusive-1條。 新的過濾條件操作符 一些新的操作符被加到JDOQL中,以便執行針對引用、Map、字符串和數字的操作。instanceof操作符返回一個boolean值,可以讓你過濾某個指定類的對象;同樣返回boolean值的containsKey(Object)函數和containsValue(Object)用于訪問Map元素。 字符串處理方面加入了很多函數,toLowerCase()和toUpperCase()分別完成大小寫轉換,另外還有下列函數用于查找子串位置和獲得子串:
另外,String的方法:
用于執行正則式匹配。目前只能提供有限的匹配功能。“.”和“.*”可表示通配符,而“(?i)”表示匹配不區分大小寫。 對數字型的字段,JDO2.0增加了兩個函數:
預定義查詢(Named Queries) 你可以在JDO描述符(metadata)中聲明常用的JDOQL查詢語句,這樣就不用將查詢嵌入到Java源代碼中。這樣可以提供一些靈活性,比如將查詢語句寫到一個配置好的文本文件中,而需要修改時可以直接改該文件,而不用更改Java源碼。描述符中的每個查詢都有一個名字,而要執行某個查詢時,可以使用下面的方法來創建查詢:
JDO將會搜索描述符來找到對應的預定義查詢語句并生成相應的Query對象。 訪問靜態字段(static fields) 你將可以在JDOQL中訪問數據類中以public static final方式聲明的常量。比如
而在查詢中使用類似“salary > 5000.0 && gender == MALE”的過濾條件。 批量刪除(Deletion by Query) 在JDO1.0中,要刪除一個對象,必須先將其載入內存,再刪除,然而很多情況下,你在刪除之前并不需要訪問該對象,這樣的做法比較低效。在JDO2.0中,提供了Query的幾個方法來刪除符合查詢條件的一組對象:
此查詢結果的對象會被全部從數據庫刪除。這些方法返回被刪除對象的集合。你的程序可以決定是否需要對被刪除的對象逐個訪問。如果你不訪問這些對象,Query執行的性能將不會受到任何影響,換句話說,這些對象將不會在內存中生成。 廠商擴展的查詢特性
SQL直接訪問 如果JDO2.0的查詢功能不能滿足需要,并且以下條件都滿足: 你的應用運行在關系數據庫上 你需要的查詢有SQL語句可以實現 你知道從你的類模型到數據庫的映射細節 你就可以創建一個SQL查詢,方法是調用PersistentManger的方法:
每一個參數需要設置為“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,開發人員們將享受面向對象的模型設計和高效的數據存儲管理系統。 |
溫馨提示:喜歡本站的話,請收藏一下本站!