[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 メーリングリストの案内