オブジェクト指向データベース db4Object を試す 〜その2〜

前回
blog1.mammb.com

からの続きです。

ネイティブクエリ

以下のように2冊のBookが登録されていたとします。

Author author1 = new Author("Brian", "Kernighan");
Book book1 = new Book("The C Programming Language", author1, 1000);
db.store(book1);

Author author2 = new Author("Bertrand", "Meyer");
Book book2 = new Book("Object-Oriented Software Construction", author2,	7590);
db.store(book2);


価格が2000以下のBookを検索するには以下のようにします。

import com.db4o.query.Predicate;
・・・
List<Book> books = db.query(new Predicate<Book>() {
    public boolean match(Book book) {
        return book.getPrice() <= 2000;
    }
});

match() に指定した条件に合致するオブジェクトが取得されます。

etc9.domain.Book@8bdcd2[title=The C Programming Language,author=etc9.domain.Author@12a0f6c[firstName=Brian,lastName=Kernighan],price=1000]
etc9.domain.Author@12a0f6c[firstName=Brian,lastName=Kernighan]

こんな感じで、「The C Programming Language」が取得できます。

Query

Query オブジェクトにて以下のように検索することもできます。

Query query = db.query();
query.constrain(Book.class);
ObjectSet<Book> result = query.execute();

上記例では特に条件を指定していないため、すべてのBookオブジェクトが検索されます。


タイトルで絞り込む場合には以下のようになります。

Query query = db.query();
query.constrain(Book.class);
query.descend("title").constrain("The C Programming Language");
ObjectSet<Book> result = query.execute();


タイトルが"The C Programming Language"以外のBookを検索するには以下のようになります。

query.descend("title").constrain("The C Programming Language").not();

ANDとOR

タイトルが"The C Programming Language"かつ価格が 1000 の AND条件で Book を検索するには以下のようになります。

Constraint constr = query.descend("title").constrain("The C Programming Language");
query.descend("price").constrain(1000).and(constr);


OR条件は以下のようになります。

Constraint constr = query.descend("title").constrain("The C Programming Language");
query.descend("price").constrain(7590).or(constr);

範囲指定

範囲条件は以下のメソッドにて指定できます。

query.descend("price").constrain(500).greater();
query.descend("price").constrain(500).smaller();

ソート順

ソート順を指定するには orderDescending() と orderAscending() が用意されています。

Query query = db.query();
query.constrain(Book.class);
query.descend("price").orderDescending();
ObjectSet<Book> result = query.execute();

Author を条件に Book を検索

Book を Author の条件から検索するには以下のようにできます。

Query query = db.query();
query.constrain(Book.class);
		query.descend("author").descend("firstName").constrain("Bertrand");
ObjectSet<Book> result = query.execute();


以下のようにしても同じ検索となります。

Author author = new Author("Bertrand", null);
query.descend("author").constrain(author);

Book を条件に Author を検索

Query bookQuery = db.query();
bookQuery.constrain(Book.class);
bookQuery.descend("price").constrain(1000);

Query query = bookQuery.descend("author");
ObjectSet<Author> result = query.execute();

次回に続く。。