Cayenneの簡単なテスト
では、Messageオブジェクトが出来上がったので、Cayenneのコーディングをやってみます。
WebObjectsのEOFに似ている事がよく分かると思います。
まずは、新規のMessageオブジェクトをインサートしてみます。
インサートのサンプル(Cayenne)
public void testInsert() { Message mes = new Message(); mes.setSubject("タイトル"); mes.setUserName("テスト君"); mes.setUserPass("test"); mes.setMail("mail@test.com"); mes.setUrl("http://www.test.com"); mes.setContent("テストの書き込みです。"); Date now = new Date(); mes.setSubmitDate(now); mes.setModificationDate(now); DataContext context = Configuration.getSharedConfiguration().getDomain().createDataContext(); context.registerNewObject(mes); context.commitChanges(Level.WARN); }
context.commitChangesの時に、Log4jのLevelをセットしてあげると、ロギングしてくれます。
WARN QueryLogger: INSERT INTO message (content, id, m_date, mail, p_id, s_date, subject, url, user_name, user_pass) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
WARN QueryLogger: [bind: 'テストの書き込みです。', 320, '2004-09-01 10:40:16.824', 'mail@test.com', NULL, '2004-09-01 10:40:16.824', 'タイトル', 'http://www.test.com', 'テスト君', 'test']
EOFでは、以下のような感じになります。
インサートのサンプル(EOF)
EOEditingContext context = new EOEditingContext(); context.insertObject(mes); context.saveChanges();
DataContextをEOEditingContextと読み替えると、EOFのコーディングと似ている事がよく分かると思います。
つぎに、セレクトしてみましょう。
セレクトのサンプル(Cayenne)
public void testSelect() { SelectQuery query = new SelectQuery("Message"); query.setLoggingLevel(Level.WARN); Expression expression = ExpressionFactory.matchExp("subject", "タイトル"); query.setQualifier(expression); DataContext context = Configuration.getSharedConfiguration().getDomain().createDataContext(); List allDatas = context.performQuery(query); for (int i = 0; i < allDatas.size(); i++) { Message mes = (Message) allDatas.get(i); System.out.println(mes); } }
ログには以下のような感じで表示されます。
subject="タイトル"の項目が2つ登録されている事が分かります。
WARN QueryLogger: === returned 2 rows. - took 273 ms. {[ userName => テスト君 parentId => null modificationDate => Wed Sep 01 10:35:12 JST 2004 content => テストの書き込みです。 url => http://www.test.com submitDate => Wed Sep 01 10:35:12 JST 2004 toParent => org.objectstyle.cayenne.Fault$ToOneFault@9ffb18 subject => タイトル mail => mail@test.com children => org.objectstyle.cayenne.Fault$ToManyFault@1de914 userPass => test ]<oid: bbs.data.Message: <id: 300>; state: committed>} {[ userName => テスト君 parentId => null modificationDate => Wed Sep 01 10:40:16 JST 2004 content => テストの書き込みです。 url => http://www.test.com submitDate => Wed Sep 01 10:40:16 JST 2004 toParent => org.objectstyle.cayenne.Fault$ToOneFault@9ffb18 subject => タイトル mail => mail@test.com children => org.objectstyle.cayenne.Fault$ToManyFault@1de914 userPass => test ]<oid: bbs.data.Message: <id: 320>; state: committed>}
このQueryオブジェクトを作る所も、EOFが意識されている事が分かります。
EOFなら以下のように書けるでしょう。
セレクトのサンプル(EOF)
EOQualifier qual = EOQualifier.qualifierWithQualifierFormat("subject = 'タイトル'",null); EOFetchSpecification fetchSpec = new EOFetchSpecification("Message",qual,null); NSArray allDatas = context.objectsWithFetchSpecification(fetchSpec);
SQLでいう所の「ORDER BY」を付けるには、Cayenneではqueryを作っている所に以下を追加します
クエリの例(Cayenne)
query.addOrdering("submitDate",false);
ここの第二引数のfalseはORDER BY DESCにする場合はtrueにするという意味です。
EOFだと、ちょっと面倒なコーディングになります。
クエリの例(EOF)
EOSortOrdering sortOrder = EOSortOrdering.sortOrderingWithKey("submitDate",EOSortOrdering.CompareAscending); NSArray orderings = new NSArray( new Object[] {sortOrder} ); EOQualifier qual = EOQualifier.qualifierWithQualifierFormat("subject = 'タイトル'",null); EOFetchSpecification fetchSpec = new EOFetchSpecification("Message",qual,orderings); NSArray allDatas = context.objectsWithFetchSpecification(fetchSpec);
この辺のクエリを作るコーディングは、Cayenneの方が洗練されているような気がします。
WebObjectsのEOModelerでFetchSpecficationをGUIで作れるので、楽は楽なんですが・・・