[Seasar-user:1450] =?ISO-2022-JP?B?GyRCPmMzMkpzOXAhJxsoQlMyRGFvIDEuMC4xNxskQiRO?= =?ISO-2022-JP?B?TjoxGyRCJV4lQyVUJXMlMD5jMzIbKEI=?=

Tsutomu Yano benbrand
2005年 1月 17日 (月) 01:05:35 JST


 矢野と申します。よろしくお願いします。

 S2Dao 1.0.17と、DBとしてPostgreSQL 7.4.5を使った環境で、自動生成されるSQLの関係で
SQLRuntimeExceptionが発生しましたので報告します。

 N:1リレーションの定義をする際に、N側と1側のリレーションキーが同じ名前の場合、
自動生成されるSQLに(少なくともPostgreSQLにとっては)問題があります。

テーブル
User
   user_id CHAR(10)
   name VARCHAR(50)

UserInfo
   user_id CHAR(10)
   info VARCHAR(100)

User.java内での、N:1リレーションのための定義
   public static final int userInfo_RELNO = 0;
   public static final String userInfo_RELKEYS = "user_id:user_id";
   private UserInfo userInfo;
   getter....
   setter....

 上記のような構造で、Userを取得するために、UserDaoというInterfaceをつくり、自動
インジェクションによりDao化しています。

 ここでUserDaoにて、プライマリーキーにてUserオブジェクトを取得しようとすると、
下記のようなイメージのSQLが生成されます。

 SELECT USER.name, userinfo.info AS userinfo_0,
  FROM USER
  LEFT OUTER JOIN USERINFO userinfo ON USER.user_id = USERINFO.user_id
  WHERE user_id = '正しいキー文字列';  -- ここ

 上記の「ここ」と書かれたWHERE句の、user_idが「USER.user_id」で無いため、
PostgreSQLでは「user_idカラムが曖昧です」といった英語のメッセージが表示されます。
(すみませんが今手元にログがないのです...)。USERとUSERINFOの双方にuser_id列が
あるため、WHERE句のuser_idがどちらのuser_idか分からない、ということのようです。

 WHERE句を「WHERE USER.user_id = '正しいキー文字列'」に変更すると、期待した
抽出結果が得られました。

 エラーメッセージ上にもPSQLのエラーである旨記述がありましたし、上記と同じ条件を
HSQLDBを使って行なってみたところ、生成されるSQLは上記のようなWHERE句になりましたが、
正常に動きました。PostgresSQLの実装に関連した問題で間違いなさそうです。

 ただ、WHEREの自動生成分にテーブル名を入れるだけで無くなる問題なので、次のS2Daoにて
WHERE句にもテーブル名をつけるようにしていただければ、と思い報告します。

 できればソースを追いかけて、修正個所まで指摘しようかとも思いましたが、ともかく、
まず分かっている事象だけでも報告させていただきます。

---------------------------------------------------
矢野 勉(やの つとむ)
電子メール:[E-MAIL ADDRESS DELETED]
---------------------------------------------------




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