Torque How to

Copyright (C) 1997-2004 by Haruaki TAMADA All rights reserved.
Last Modified: Mon Jan 10 11:07:32 JST 2005

目次

ページのトップへ

Torque とは何ぞや

Torque は Jakarta Turbine の一部として開発されていましたが、 最近は Apache DB Project のサブプロジェクトの一つとなりました。

Apache DB Project のサブプロジェクトですから、もちろん、 データベースとのやりとりをするための API です。 これだけではなく、SQL を内部で作成するために、データベースが Oracle であろうが、 PostgreSQL であろうが、IBM DB2 であろうが、MySQL であろうが、 プログラムを一切変更せず対応できてしまうのです。 また、テーブル一つに対し、Java のソースが一つ生成され、データベースへのアクセスを気にしないで コーディングすることができます。

このページは更新されません。 私は既に Torque を使っておらず、使う機会もしばらくはないためです。 そして最近、Torque に関する日本語の情報も得られるようになってきました。 そのため、書く気がなくなったというのが一番大きな理由でしょうか。 Torque のことをもっと知りたければ、下の リンク から辿れる ページを御覧下さい。

ページのトップへ

こんな時はどうするの?

いきなり FAQ です。Torque の使い方なんて http://db.apache.org/torque/ を見て、設定ファイル書いて、ant を実行すればできるのですから、 私がうだうだ説明するよりも他にも説明してくれているサイトを見れば良いと思います。

まぁ、そのうち使い方も書くかもしれませんが。

Oracle で ORDER BY と LIMIT が動かない

はい。私もこの問題にはまりました。 ソートした結果から 10 件目から 20 件目までを取り出したいという時、 私が確認できている限り、Oracle では取り出したい結果が取り出せません。 それは Oracle が LIMIT をサポートしているため、順番として、LIMIT した結果で ORDER BY をかけているようなのです。 (ちょっと使ってから日が立っているため正確ではないかもしれない) ではどうするか。私は次の方法で解決しました。

org.apache.torque.adapter.DBOracle というクラスの中に supportNativeLimitgetLimitStyle という 二つのメソッドがあります。 この帰り値を falseDB.LIMIT_STYLE_NONE に変更します。

こうすることで、LIMIT により取得する件数を制限していたのが ResultSet をぐるぐる回すことで制限するようになります。

一つのカラムに対する複数の条件

Torque では SELECT の条件に Criteria というクラスを使います。 しかし、この Criteria だけでは SELECT の条件に不十分な時があります。 それは一つのカラムに複数の条件が必要な場合です。

例えば SOME_DATA という NUMBER 型のカラムを取り出す時に SOME_DATA の値が 10 以上かつ 20 以下の値を抽出したい場合を考えます。 SQL としては以下のような文を期待しています。

SELECT * FROM SOME_TABLE WHERE SOME_DATA >= 10 AND SOME_DATA <= 20

これを Criteria でやろうとした場合、 単純に考えると以下のようになります。

Criteria criteria = new Criteria("SOME_TABLE");
criteria.add("SOME_DATA", 10, Criteria.GREATER_EQUALS);
criteria.add("SOME_DATA", 20, Criteria.LESS_EQUALS);

しかし、上のようなコードでは思い通りにデータは抽出されません。 Criteria では、一つのカラムには一つの条件しか指定することはできません。 もし、一つのカラムに対して、Criteria で複数の条件を指定すると 一番最後の条件しか指定されなかったこととなります。

そんな時の解決策として、Criteria の内部クラスである Criteria.Criterion があります。 これを使うと一つのカラムに対して複数の条件を指定することができます。 だから、先ほどの例をきちんと動作するように書くと以下のようなコードとなります。

Criteria criteria = new Criteria("SOME_TABLE");
criteria.add("SOME_DATA", 10, Criteria.GREATER_EQUALS);
Criteria.Criterion criterion = criteria.getNewCriterion(
    "SOME_DATA", 
    new Integer(10), Criteria.LESS_EQUALS
);
criteria.and(criterion);

これで一つのカラムに対する複数の条件が指定できるようになります。

ページのトップへ

リンク

参考資料

リンク

ページのトップへ