からの続きです。
ネイティブクエリ
以下のように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();
次回に続く。。