[Seasar-user:16117] Re: [S2JDBC] innerJoin と leftOuterJoin で同じ Entity を指定したい

Shotaro Tsubouchi [E-MAIL ADDRESS DELETED]
2008年 10月 27日 (月) 03:24:46 JST


ショータローこと坪内です。

> SQL としてはどちらも等価ですが,意図が明瞭なのは
> こちらだと思います.

等価ではありますが、パフォーマンス面を考えると、
意図は明確なのかもしれませんが、副問い合わせという選択は微妙に思えます。
(最近のRDB事情に詳しくないので、的を得てない言及だったらごめんなさい。)


> この例は結合さえできれば後は用がないので
> それで済みますが,結合できた後に他の結合も
> 含めた選択条件が必要になると無理が出てきます.
> 
> まぁ,AutoSelect で扱える範囲を少し広げるだけと
> 割り切れば,フェッチしない結合は重複を許し,
> WHERE では使えないとするのは悪くないのですが,
> 現在はフェッチしない結合を WHERE で扱えているので,
> 無条件に WHERE で使えなくすると既存のコードが
> 動かなくなり,重複した時だけ使えなくすると
> いかにも落とし穴になりそうです.

すみません、ここのくだりが良くわかっていません。

フェッチしない結合を WHERE で扱えている、というのは、
これは、タイプセーフな記述ではないが、扱うことは可能という事でしょうか?
であるとするならば、そうなのでしょうが、残念ながら魅力に欠けるように思います。
逆に言えば、タイプセーフで記述できる事にかなりの魅力を感じている、と言うことです。
(何でもかんでもタイプセーフで実現できるようにとは思っていませんが、
 その線引きはどこだ?というのも難しい問題だとは思います。。)

今でも WHERE でやろうと思えばやれるが、
JOIN でなら、重複さえ許せばタイプセーフでそのまま実現できるのではないか?
ということが私の言いたいことです。
(このことが全体的なパフォーマンス劣化に如実に影響するということなのであれば。
無理強いはしません。)

これを許してしまうと、
WHERE で使えなくなったり、重複した時に使えなくなったりする、というのは
どういう場合なのでしょうか?


> 違いますよ.この例は本当に結合の条件です.
> サラリーが 1000 より多い従業員だけを結合するので,
>
> ID = 1 の部分だけを選択条件と書いたのではなく,
> その結合全体が選択条件だと書いたのです.

"部署に所属する、サラリーが 1000 より多い従業員"だと、

jdbcManager.from(Department.class)
    .leftOuterJoin("employee", "employee.salary > ?", 1000)
    .getResultList();

こうで、"サラリーが 1000 より多い従業員、を含む部署"だと、

jdbcManager.from(Department.class)
    .innerJoin("employee", "employee.salary > ?", 1000)
    .getResultList();

このようになると思いますが、leftOuterJoin なのであれば結合条件だけど、
innerJoin であるならば選択条件でしょ、ということですね。
そこは理解できましたが、その厳密性って必要and重要、、でしょうか?





Seasar-user メーリングリストの案内