<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    新的起點 新的開始

    快樂生活 !

    翻譯DB4O參考——Query(四)

    NQ

    你不想使用你使用的編程語言來構(gòu)造查詢條件?它是100%類型安全并且100%編譯時檢查和100%可分解.不想通過面向?qū)ο蟮?br />原則來實現(xiàn)查詢? 來吧!進入NQ
    NQ是主要的查詢接口,它被推薦使用在你的應(yīng)用中查詢數(shù)據(jù)庫,因為它采用你使用的編程語言的語法,它是完美的標準,對于
    將來也是安全的選擇.
    NQ支持所有平臺.

    觀念

    NQ的感念來自下面的兩篇文章:
    Cook/Rosenberger, Native Queries for Persistent Objects, A Design White Paper
    Cook/Rai, Safe Query Objects: Statically Typed Objects as Remotely Executable Queries

    原則

    NQ通過運行一行或者多行代碼而不是一個對象的所有實例.NQ表達式返回真,標記指定的實例作為查詢的結(jié)果集的一部分,
    db4o試圖優(yōu)化NQ表達式,通過索引而不是真實的實例.
    簡單的例子:
    讓我們看看采用db4o所支持的編程語言,用NQ是多么的簡單.

    Java5:

    PrimitiveExample.java: primitiveQuery
    public static void primitiveQuery(ObjectContainer db)...{
    ??? List pilots = db.query(new Predicate() ...{
    ??????? public boolean match(Pilot pilot) ...{
    ??????????? return pilot.getPoints() == 100;
    ??????? }
    ??? });
    ? }
    Java1.2-1.4:

    NQExample.java: primitiveQuery
    public static void primitiveQuery(ObjectContainer db)...{
    ????? List <Pilot> pilots = db.query(new Predicate<Pilot>() ...{
    ????????? public boolean match(Pilot pilot) ...{
    ????????????? return pilot.getPoints() == 100;
    ????????? }
    ????? });?
    ??? }

    Java1.1:

    PrimitiveExample.java: primitiveQuery1
    public static void primitiveQuery1(ObjectContainer db)...{
    ??? List pilots = db.query(new PilotHundredPoints());
    ? }
    PilotHundredPoints.java
    /**//* Copyright (C) 2004 - 2006 db4objects Inc.
    http://www.db4o.com */
    import com.db4o.query.Predicate;

    public class PilotHundredPoints extends Predicate ...{
    ??? public boolean match(Pilot pilot) ...{
    ??????? return pilot.getPoints() == 100;
    ??? }
    }

    順便提醒一下上邊的語法:
    對于所有的方言不支持通用類型,NQ按照習慣工作.一個繼承Predicate類的對象有一個返回布爾值方法match()或者Match()
    這個方法有一個參數(shù).
    Java: boolean match(Pilot candidate);
    當你使用NQ時,別忘記用先進IDE來輸入NQ表達式.如果你使用了模板和自動完成功能.
    下面是如何在Eclipse3.1中配置:
    1.打開菜單,選擇 Window + Preferences + Java + Editor + Templates + New
    名字為np,確保選擇java在context中,拷貝下面內(nèi)容到Pattern field中:
    List <${extent}> list = db.query(new Predicate <${extent}> () {
    public boolean match(${extent} candidate){
    return true;
    }
    });
    現(xiàn)在,你可以創(chuàng)建NQ查詢通過n + q + Control-Space
    這些簡單的功能在許多先進的IDE是有效的.

    深入的例子


    對于復(fù)雜的查詢,NQ語法是非常準確并且便于很快的書寫.讓我們比較SODA查詢給定名字或者給定成績區(qū)間的pilot.
    存儲:
    NQExample.java: storePilots
    public static void storePilots(ObjectContainer db) ...{
    ?????? db.set(new Pilot("Michael Schumacher",100));
    ?????? db.set(new Pilot("Rubens Barrichello",99));
    ??? }
    通過SODA查詢:
    NQExample.java: retrieveComplexSODA
    public static void retrieveComplexSODA(ObjectContainer db) ...{
    ??????? Query query=db.query();
    ??????? query.constrain(Pilot.class);
    ??????? Query pointQuery=query.descend("points");
    ??????? query.descend("name").constrain("Rubens Barrichello")
    ????????? .or(pointQuery.constrain(new Integer(99)).greater()
    ????????????? .and(pointQuery.constrain(new Integer(199)).smaller()));
    ??????? ObjectSet result=query.execute();
    ??????? listResult(result);
    ??? }
    下面是通過NQ語法實現(xiàn)相同的查詢.它是跟容易自動完成可分解等其他IDE特性,并且還是運行期檢查.
    NQExample.java: advancedQuery
    public static void advancedQuery(ObjectContainer db)...{
    ????? List <Pilot> result = db.query(new Predicate<Pilot>() ...{
    ????????? public boolean match(Pilot pilot) ...{
    ????????????? return pilot.getPoints() > 99
    ????????????????? && pilot.getPoints() < 199
    ???????????????? || pilot.getName().equals("Rubens Barrichello");
    ???????? }
    ????? });?
    ?? }

    隨意的查詢 .

    基本而言,你可以有效地使用NQ,原則上,你可以運行使用NQ任意隨意的查詢,你僅僅要考慮其他的影響,特別是
    可能影響持久化的對象.
    讓我們運行一個例子來包括更多的有效語言特性:
    NQExample.java: retrieveArbitraryCodeNQ
    public static void retrieveArbitraryCodeNQ(ObjectContainer db) ...{
    ????? final int[] points=...{1,100};
    ??????? ObjectSet result=db.query(new Predicate<Pilot>() ...{
    ????????? public boolean match(Pilot pilot) ...{
    ??????????? for(int i=0;i<points.length;i++) ...{
    ????????????? if(pilot.getPoints()==points[i]) ...{
    ??????????????? return true;
    ????????????? }
    ??????????? }
    ??????????? return pilot.getName().startsWith("Rubens");
    ????? }
    ??????? });
    ??????? listResult(result);
    ??? }

    NQ 性能

    對于NQ的一個缺點必須要指出:NO引擎試圖分析NQ表達式,并把它們轉(zhuǎn)化為SODA,這對于所有的查詢時不可能的.對于某些
    查詢,這種分析將是非常困難,如何這樣,db4o將不得不實例化一些持久對象來執(zhí)行NQ代碼.db4o將試圖分析部分NQ表達式
    來保證對象實例盡量的少.
    db4o社區(qū)有對NQ優(yōu)化團隊,你可以把你的結(jié)果和反饋給db4o組織。當前優(yōu)化細節(jié)在NQ Optimization 章節(jié)。
    對于當前的實現(xiàn),上面除了隨意的查詢外,其他的都進行了優(yōu)化。

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

    公告

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

    統(tǒng)計

    常用鏈接

    留言簿(13)

    隨筆分類(71)

    隨筆檔案(179)

    文章檔案(13)

    新聞分類

    IT人的英語學習網(wǎng)站

    JAVA站點

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

    官網(wǎng)學習站點

    生活工作站點

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲色精品aⅴ一区区三区| 激情综合亚洲色婷婷五月APP| 亚洲av纯肉无码精品动漫| 国产一区二区免费视频| 国产jizzjizz视频全部免费| 亚洲网址在线观看| 中国在线观看免费的www| 日本高清免费aaaaa大片视频| 亚洲视频在线观看不卡| 在线免费观看h片| 免费在线观看的黄色网址| 亚洲精品国产国语| 日韩中文字幕免费视频| 亚洲午夜久久久久久久久久| 色偷偷亚洲第一综合| 18禁超污无遮挡无码免费网站国产 | 亚洲av永久中文无码精品| 最近中文字幕2019高清免费 | 亚洲欧洲∨国产一区二区三区| 久久亚洲精品11p| 毛片a级三毛片免费播放| 亚洲男人天堂av| 久久国产乱子伦精品免费强| 久久久无码精品亚洲日韩软件| 污视频网站在线观看免费| 在线免费观看视频你懂的| 亚洲一区二区久久| 最近中文字幕免费mv在线视频| 亚洲国产精品一区第二页| 中国黄色免费网站| 亚洲精品无码av天堂| 老司机午夜性生免费福利| 日韩视频在线免费| 亚洲一区二区三区写真| 国产啪精品视频网免费| 亚洲区精品久久一区二区三区| 精品无码免费专区毛片| 亚洲欧洲春色校园另类小说| 蜜臀98精品国产免费观看| 亚洲的天堂av无码| 18禁成人网站免费观看|