便利な便利なS2JDBCの機能

最近は電車の中では、印刷した本家サイトを読んでいます。
サイトを読んでいますと、かゆい所に手が届いている機能が結構あります。

今回、テストを実行する前に、テストデータを予め14件設定しました。

<LimitとOffset>
ページング(次へ、前へ)を一覧画面では作成します。ページングは1回作成すれば、使いまわしが何回もでき、便利な機能なのですが、作成する事よりむしろテストの方が大変です。
データベースからの取得もどこからどこまで、を指定しているので、取得したデータから必要なデータのみ残すという処理をコーディングしたりします。
なんと、この面倒な機能が既に用意されているので、早速試してみます。

ServiceClass

public List findOrderVouchers(int limit, int offset) {
return this.jdbcManager.from(OrderVoucher.class).orderBy(asc(id())).limit(limit).offset(offset).getResultList();
}

テストクラス

public void testLimitOffset() throws Exception {
List lists = orderVoucherService.findOrderVouchers(2, 5);
assertEquals(lists.size(),2);
}

うまくいきました、さらにSQLのデバック文が出力され、どのようなSQL文が組み立てられているのか、直ぐにわかります。

select * from ( select temp_.*, rownum rownumber_ from ( select T1_.ID
as C1_, T1_.ACCOUNT_ID as C2_, T1_.ACCOUNT_NAME as C3_, T1_.VERSION as
C20_ from ORDER_VOUCHER T1_ order by C1_ ) temp_ where rownum <= 7 )
where rownumber_ > 5

先に言いますが、項目は実は全て20項目ありますが、一部のみ抜粋しています。シーケンスに番号をフレームワークはきちんと設定しています
(ここだけ見ると、ランダム?と思われてしまうので)。

いつもページングは避けたい=面倒ですので、という気持ちがあり、デモアプリ(モックアップ)を作成する時は、ほぼ避けます。
件数が多いから付けて!!!とお客さんから指摘されて、しょうがないなぁ、という気持ちで追加します。この使い方で問題ないので、後は画面次第です。


<昇順・降順の複数設定>

今回の案件では「動的」という言葉がキーワードになり、色々な値や条件が動的に変わります。
この動的に対応できるか、複数の値を条件に設定してみます。

ServiceClass

public List findOrderVoucherDesc(String orderBy) {
return this.jdbcManager.from(OrderVoucher.class).orderBy(orderBy).getResultList();
}

テストクラス

public void testOrderDesc() throws Exception {
List lists =
orderVoucherService.findOrderVoucherDesc("accountid, accountname
ASC");
//select T1_.ID as C1_, T1_.ACCOUNT_ID as C2_, T1_.ACCOUNT_NAME
as C3_, T1_.VERSION as C20_ from ORDER_VOUCHER T1_ order by C2_
assertEquals(lists.size(),14);
}

うまくいきました。恐らく、asc(accountid()), asc(accountname())とコーディングした方がきれいだと思いますが、まずは成功事例、という事で。


<Where句>
普通でしたら、Betweenでできる対応かもしれないですが、Betweenはないので、以下の対応です。本家サイト、再チェック!です。

ServiceClass

public List findOrderVoucherSimpleWhere(Long
startLength, Long endLength) {
return this.jdbcManager.from(OrderVoucher.class).where(new
SimpleWhere().ge("id", startLength).le("id",
endLength)).getResultList();
}

テストクラス

public void testSimpleWhere() throws Exception {
List lists =
orderVoucherService.findOrderVoucherSimpleWhere(Long.parseLong("1"),
Long.parseLong("5"));
//select T1_.ID as C1_, T1_.ACCOUNT_ID as C2_, T1_.ACCOUNT_NAME
as C3_, T1_.VERSION as C20_ from ORDER_VOUCHER T1_ where (T1_.ID >= 1
and T1_.ID <= 5)
assertEquals(lists.size(),5);
}

うまくいきました。すごいと感じたのは、このge leのメソッドを幾つでも設定することができるということです。


<Where句 Namesクラス>

ServiceClass

public List findOrderVoucherOperations(Long
startLength, Long endLength) {
return this.jdbcManager.from(OrderVoucher.class).where(ge(id(),startLength),le(id(),endLength)).getResultList();
}

テストクラス

public void testOperations() throws Exception {
List lists =
orderVoucherService.findOrderVoucherOperations(Long.parseLong("10"),Long.parseLong("14"));
//select T1_.ID as C1_, T1_.ACCOUNT_ID as C2_, T1_.ACCOUNT_NAME
as C3_, T1_.VERSION as C20_ from ORDER_VOUCHER T1_ where *1
assertEquals(lists.size(),5);
}

うまくいきました。後者のやり方の方が推奨されています。

しかし、便利な機能が豊富ですね、動的に条件等が変わる案件でかなり強さを発揮できそうな予感が強く感じています。

*1:T1_.ID >= 10) and (T1_.ID <= 14