新的起點(diǎn) 新的開始

          快樂生活 !

          翻譯DB4O參考——Query(三)

          SODA Query API

          SODA是db4o底層查詢接口,它允許你直接使用查詢圖的節(jié)點(diǎn)。由于SODA使用字符串來區(qū)分屬性,所以沒有很好類型安全
          機(jī)制和編譯時(shí)檢測(cè),同時(shí),它的書寫比較冗長。對(duì)于大多數(shù)應(yīng)用,NQ是比較好的查詢接口。然而,如果一個(gè)應(yīng)用需要?jiǎng)討B(tài)生成查詢條件的需求,SODA將是必須的,這就是為什么在這介紹它。

          簡(jiǎn)單的查詢:
          讓我們看看如何將我們熟悉的QBE查詢條件用SODA來表示,一個(gè)新的查詢對(duì)象通過query()方法從ObjectContainer中得到,
          我們可以給它添加約束條件。查詢所有Pilot實(shí)例,我們通過Pilot來添加約束。
          QueryExample.java: retrieveAllPilots
          public static void retrieveAllPilots() {
          ????? ObjectContainer db=Db4o.openFile(YAPFILENAME);
          ???? try {
          ????????? Query query=db.query();
          ?????   query.constrain(Pilot.class);?????????
          ? ObjectSet result=query.execute();
          ???????? listResult(result);
          ????? } finally {
          ??????? db.close();
          ???? }
          ?? }
          基本上,我們交換我們真實(shí)的原形來用元數(shù)據(jù)來表述我們想要查找的對(duì)象:一個(gè)查詢圖是由查詢節(jié)點(diǎn)和約束組成。查詢節(jié)點(diǎn)
          對(duì)于候選對(duì)象而言是一個(gè)占位符,而約束條件決定是否要添加或者去除候選對(duì)象。
          我們簡(jiǎn)單的查詢圖如下:
          圖一


          我們僅僅查詢?nèi)我夂蜻x對(duì)象(在這里,也就是數(shù)據(jù)庫中所有對(duì)象)它們的類型是Pilot將并加入結(jié)果集中。
          通過pilot的名字來查詢,我們不得不進(jìn)一步通過名字屬性和字符串的值來限制候選對(duì)象。
          public static void retrievePilotByName(ObjectContainer db) {
          ??????? Query query=db.query();
          ??????? query.constrain(Pilot.class);
          ?????? query.descend("name").constrain("Michael Schumacher");
          ?????? ObjectSet result=query.execute();
          ??????? listResult(result);
          ??? }
          在這里,decend意思是什么呢?其實(shí)正如我們真實(shí)原形,我們添加約束條件來約束我們候選中的子成員.

          圖二

          所以,一個(gè)候選者是pilot類型,有一個(gè)"name"屬性,并且值等于所給的字符串.
          注意:對(duì)于類型的約束不是必須的,如果你去除,查詢結(jié)果將是所有具有"name"屬性.并且值等于所給的所有對(duì)象,但是這種查詢不符合一般的查詢行為.通過精確條件查找一個(gè)pilot是類似的,我們通過java原始對(duì)象區(qū)別.

          QueryExample.java: retrievePilotByExactPoints
          public static void retrievePilotByExactPoints(
          ??????????? ObjectContainer db) {
          ?????? Query query=db.query();
          ?????? query.constrain(Pilot.class);???????
          ?query.descend("points").constrain(new Integer(100));
          ??????? listResult(result);
          ??? }

          有一個(gè)場(chǎng)景,我們不想通過緊缺屬性值來查詢而是同過指定范圍來查詢.這個(gè)功能由Constraint API 提供.首先,讓我們查詢名字不是"Michael Schumacher"的所有Pilots
          QueryExample.java: retrieveByNegation
          public static void retrieveByNegation(ObjectContainer db) ...{
          ??????? Query query=db.query();
          ??????? query.constrain(Pilot.class);
          ??????? query.descend("name").constrain("Michael Schumacher").not();
          ??????? ObjectSet result=query.execute();
          ??????? listResult(result);
          ??? }
          這兒是個(gè)取反的布爾運(yùn)算,其他的布爾運(yùn)算也很接近.
          QueryExample.java: retrieveByConjunction
          public static void retrieveByConjunction(ObjectContainer db) ...{
          ??????? Query query=db.query();
          ??????? query.constrain(Pilot.class);
          ??????? Constraint constr=query.descend("name")
          ??????????????? .constrain("Michael Schumacher");
          ??????? query.descend("points")
          ??????????????? .constrain(new Integer(99)).and(constr);
          ??????? ObjectSet result=query.execute();
          ??????? listResult(result);

          QueryExample.java: retrieveByDisjunction
          public static void retrieveByDisjunction(ObjectContainer db) ...{
          ??????? Query query=db.query();
          ??????? query.constrain(Pilot.class);
          ??????? Constraint constr=query.descend("name")
          ??????????????? .constrain("Michael Schumacher");
          ??????? query.descend("points")
          ??????????????? .constrain(new Integer(99)).or(constr);
          ??????? ObjectSet result=query.execute();
          ??????? listResult(result);
          ??? }

          ??? }
          我們可以比較給定的值來約束.
          QueryExample.java: retrieveByComparison
          public static void retrieveByComparison(ObjectContainer db) ...{
          ?????? Query query=db.query();
          ??????? query.constrain(Pilot.class);
          ??????? query.descend("points")
          ??????????????? .constrain(new Integer(99)).greater();
          ??????? ObjectSet result=query.execute();
          ??????? listResult(result);
          ?? }
          這個(gè)查詢接口允許默認(rèn)值的查詢.

          QueryExample.java: retrieveByDefaultFieldValue
          public static void retrieveByDefaultFieldValue(
          ??????????????????? ObjectContainer db) ...{
          ??????? Pilot somebody=new Pilot("Somebody else",0);
          ??????? db.set(somebody);
          ??????? Query query=db.query();
          ??????? query.constrain(Pilot.class);
          ??????? query.descend("points").constrain(new Integer(0));
          ??????? ObjectSet result=query.execute();
          ??????? listResult(result);
          ??????? db.delete(somebody);
          ??? }

          也可以對(duì)結(jié)果排序
          QueryExample.java: retrieveSorted
          public static void retrieveSorted(ObjectContainer db) ...{
          ??????? Query query=db.query();
          ??????? query.constrain(Pilot.class);
          ??????? query.descend("name").orderAscending();
          ??????? ObjectSet result=query.execute();
          ??????? listResult(result);
          ??????? query.descend("name").orderDescending();
          ??????? result=query.execute();
          ??????? listResult(result);
          ??? }
          這些組合都是隨意的,請(qǐng)你試試.也許有許多查詢情景可能采用constrains的查詢接口無法實(shí)現(xiàn),不過不用擔(dān)心,你可以
          更隨意的應(yīng)用Evaluations來實(shí)現(xiàn).Evaluations 的討論在 Evaluations chapter.


          posted on 2007-03-13 15:49 advincenting 閱讀(469) 評(píng)論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫相關(guān)

          公告

          Locations of visitors to this pageBlogJava
        1. 首頁
        2. 新隨筆
        3. 聯(lián)系
        4. 聚合
        5. 管理
        6. <2007年3月>
          25262728123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          統(tǒng)計(jì)

          常用鏈接

          留言簿(13)

          隨筆分類(71)

          隨筆檔案(179)

          文章檔案(13)

          新聞分類

          IT人的英語學(xué)習(xí)網(wǎng)站

          JAVA站點(diǎn)

          優(yōu)秀個(gè)人博客鏈接

          官網(wǎng)學(xué)習(xí)站點(diǎn)

          生活工作站點(diǎn)

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 边坝县| 康平县| 岐山县| 阳谷县| 池州市| 卓资县| 丰镇市| 赤水市| 新绛县| 桂平市| 延长县| 兰州市| 怀远县| 堆龙德庆县| 呈贡县| 哈尔滨市| 中宁县| 临猗县| 怀远县| 康保县| 吉木乃县| 多伦县| 祥云县| 株洲县| 隆安县| 新蔡县| 商河县| 庐江县| 原平市| 梅州市| 灌云县| 泸定县| 沐川县| 阜新市| 高唐县| 文山县| 万源市| 屏东市| 辉南县| 庆安县| 阿鲁科尔沁旗|