kodojdo指南十一章

第十一章  查詢

  你可以從PersistenceManager中得到查詢實例.查詢可以篩選符合某些標準的一批候選對象.這個篩選過程可能在數據庫中進行,或者在內存中執行.JDO沒有明文規定查詢機制.許多JDO實現品會根據情況混合使用內存執行方式和數據庫執行方式.
  現在開始研究查詢接口.你會發現自己對將討論的東西迷惑不解.這是可預料的.我們會通過一些具體的例子來說明.

11.1 必需的查詢元素

  每個查詢都有三個必需元素:
  1)候選類.查詢的篩選是針對候選類或子類的實例進行的.候選類通過setClass 方法指定.
  2)一批候選類.候選者可以是對象的集合形式或者擴展.這兩種情況都可以調用setCandidate 指定候選者.如果給出了擴展,那麼不必再個別地指定查詢的候選類.查詢會自動繼承擴展的候選類.(??翻譯得不好)
  3)篩選條件.這是用JDO查詢語言JDOQL編寫並通過setFilter 方法指定的字符串.如果不指定篩選條件,那麼查詢會返回候選類的所有對象.

11.2 可選的查詢元素
  以下是JDO查詢的可選元素
  1)Imports.導入通過declareImports 方法指定.根據標準的java導入語法,導入是單一的由";"劃分的字符串.在聲明參數和變量的時候,使用導入你就不必輸入類的全名.
  2)參數聲明.參數是篩選字符串裏的一個佔位符.它允許你寫一次查詢,然後多次執行.每次都提供新值參數通過.declareParameters 方法指定,這個方法的參數語法和JVA方法的參數聲明語法一致.
  3)變量聲明.變量用來檢測集合裏的一些項是否匹配某些條件.通過declareVariables 方法來指定.語法和標準java變量聲明語法一致.
  4)排序.有時你希望查詢的結果按照指定的順序返回.例如,你想待售轎車按照價格的升序列出,setOrdering 方法允許你添加查詢的排序標準.方法的字符串參數是排序聲明根據","分隔的列表.每個聲明由字段名加關鍵字"ascending" 或者"descending"組成.結果會先按第一個(最左邊那個)排序聲明排序,此後假如有兩個記錄符合表達式,第二個排序就會執行.以此類推.

11.3 JDOQL

  JDOQL是基於JAVA布爾表達式的數據庫無關的查詢語言.語法類似JAVA標準語法,只有如下幾點例外:
  基本類型和基本類型包裝的相等和排序比較是有效的

  日期之間的相等和排序比較是有效的
  
  相等比較通常使用"=="操作符,不支持equals方法.

  不支持.(=, +=, *=, etc) 和 ++ 和 -- 等賦值操作符

  只支持以下方法:Collection.contains ,Collection.isEmpty ,String.startsWith 和String.endsWith

  翻轉null值的字段,會拋出NullPointerException,而不是導致子表達式的值爲false

  支持以下字面量:字符,整數,浮點數,布爾值,字符串和null
 
(based on 基於 valid 有效的 Equality comparisons 相等比較 Traverse ?? )

  我們會給出一些關於查詢接口和JDOQL的例子.該例使用以下的能持久類.

  找出所有price字段值大於10的magazine對象.注意我們可以在篩選字符串中使用候選類的持久化字段.JDOQL 僅僅基於對象模型,而不是數據庫所提供的類的具體體現.

  找出title字段以"The"開頭的magazine類,以price的升序排序.

 
  找出銷售額大於出版商稅收的0.01倍的所有magazine.以出版商的revenue 字段的升序和publisher 的name字段的降序排列.注意"."號用法,從publisher中取出revenue和name字段.


  找出所有price 小於等於10出版商是Random House或者Addison Wesley的magazine

  找出這樣的magazine:由給出的公司印刷.price大於給出的數目.注意公司名和數字在查詢字符串作爲佔位符體現.在查詢沒有執行前,不提供值.並且我們使用"導入"導入org.mag.pub包,然後我們可以聲明類型是company的參數.我們也可以不使用導入方法,指定類的全名來聲明參數.

  找出這樣的magazine:封面文章有個"The Real Story"的子標題或者封面文章沒有子標題

  找出這樣的magazine:有篇文章的標題是"Fourier Transforms",注意變量的用法.代表magezine的文章集合的任一文章.
 
  找出這樣的magazine:它的article的title是一批可能的title的其中一個.在這裏我們使用集合參數保存所有可能的值,這是sql中in 的用法.

11.4 執行查詢

  正如上面顯示那樣,查詢接口有許多執行查詢的方法.各個查詢方法使用的參數不等.從0個到三個.如果查詢超過三個參數,你可以使用executeWithArray 和executeWithMap 方法.詳情參看查詢接口的javadoc文檔
  所有執行方法返回object類型.但事實上它們返回集合.JDO使用object而不是集合的,使廠商可以在某些情況下返回特定的類型,並且允許將來的擴充.

  查詢結果會佔用數據庫資源.所以當查詢不再使用的時候最好把它關閉.你可以關閉個別的查詢也可以關閉所有已打開的查詢.

11.5 查詢編譯

  查詢對象可以通過compile 方法編譯.這意味着可以優化已計劃的查詢.編譯期間,所有查詢元素都是有效的,任何不一致性都會拋出JDOUserException.
  查詢實例也可以序列化.在序列化之後,查詢不能被執行.不過它還保留它的候選類,篩選字符串,導入,參數,變量和派訊.一個已序列的查詢可以作爲相同的配置下創建其他查詢的模板.這是通過PersistenceManager的newQuery(Object template)方法來完成
 
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章