cayenneめも(ORDERするところでハマったお話)
うちのプロジェクトは、ORマッピングツールはcayenneを使っています。
今日ちょこっとハマったところがあったのでメモ。
・やりたいこと
Aテーブルのhogeカラムが"foo"のものを問い合わせする。
Bテーブルのhogeカラムでソートする。(ASCで)
なにも考えずに書くとこんな感じになります。
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になりました。
大勝利!