shokosブログ

プログラミング

cayenneめも(ORDERするところでハマったお話)

うちのプロジェクトは、ORマッピングツールはcayenneを使っています。
今日ちょこっとハマったところがあったのでメモ。

・やりたいこと
Aテーブルのhogeカラムが"foo"のものを問い合わせする。
Bテーブルのhogeカラムでソートする。(ASCで)

f:id:syoko_sasaki:20110222145510j:image

なにも考えずに書くとこんな感じになります。

SelectQuery selectQuery = new SelectQuery(B.class, ExpressionFactory.matchExp("hoge", "foo"));
selectQuery.addOrdering("toB.hoge", SortOrder.ASCENDING);

が!!!!これだと取ってこれないデータがあります。
どうやら、テーブル辿ってaddOrderingすると勝手にINNER JOINしてしまうらしいです。
つまり、Bがnullのものは取ってきてくれません。
SQLで書くとこんな感じ

SELECT
  A.*
FROM
  A
  INNER JOIN B ON A.B = B.ID
WHERE
  A.hoge = 'foo'
ORDER BY
  B.hoge;


LEFT JOINして取ってきてもらうには、以下のようにします。

SelectQuery selectQuery = new SelectQuery(B.class, ExpressionFactory.matchExp("hoge", "foo"));
selectQuery.addOrdering("toB+.hoge", SortOrder.ASCENDING);

addOrderingの第一引数の.の前に、+を書くだけ。
これだけでINNER JOINしていたところがLEFT JOINになりました。
大勝利!

参考Apache Cayenne » Path Expressions