- PR -

ResultSetで同一名のカラムの区別

1
投稿者投稿内容
未記入
ベテラン
会議室デビュー日: 2005/02/24
投稿数: 55
投稿日時: 2005-08-05 13:44
SQLでJOINすると検索結果に同一名のカラムが発生する場合があります。
これを単純にResulSetからgetString("カラム名")をすると
エラーになってしまうのですが、
これを回避する方法はありますでしょうか?

現在はそれぞれにAs句で別名をつけることによって対処してますが、
かなり面倒な作業なので、
いい方法があれば教えてください。
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2005-08-05 14:25
この場合はDBMSになりますが、そいつはどうやって、
ふたつのカラムの内、ひとつを選ぶんですか?
未記入さんの要望は、判断方法を指定もせずに、
自分に都合のいい判断をせよ、といっているようなものです。
Java僧
ぬし
会議室デビュー日: 2003/11/06
投稿数: 261
投稿日時: 2005-08-05 16:28
「As句で別名をつけることによって対処」これが教科書どおりの正解だと思います。

As句をつけない方法として ResultSet#getString(int) を使う別解もありますが、
プログラム中のSQLを変更した際に修正ミスが起こるリスクが「As句で別名」の
場合より高くなりますね。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-08-05 18:11
一応ResultSetのJavadocを見てみると、
引用:

getter メソッドへの入力として使用される列名では、大文字小文字は区別されません。列名で getter メソッドが呼び出され、複数の列が同じ名前を持つ場合は、最初に一致する列の値が返されます。列名のオプションは、結果セットで生成される SQL クエリーで列名が使用される場合に使われるよう設計されています。クエリーで明示的に命名されない列の場合には、列番号を使用するのがもっともよい方法です。列名を使用する場合、実際に目的の列を指すことを保証する方法がプログラマにはありません。



仕様に従っていないJDBCドライバも結構あるので、Javadoc通りには行かないと思いますが。

ちなみに、Javaの世界では「エラー」というとjava.lang.Errorがスローされた状態を言います。
例外が発生している事を伝えたいのであれば、スタックトレースをコピペするべきです。

Java僧さんも回答されていますが、どうしてもASが面倒なら引数に数値を使うしかないでしょう。
私的にはSQLを楽して書いてJavaで面倒な思いをするより、
SQLでAS句を使った方がよっぽど楽だと思いますが。
1

スキルアップ/キャリアアップ(JOB@IT)