質問: meta.getColumnCount(); for (int i=1; i<=cnt; i++) { // 1 オリジンなので注意 L.p("カタログ名="+meta.getCatalogName(i)); L.p("クラス名="+meta.getColumnClassName(i)); L.p("表示幅="+meta.getColumnDisplaySize(i)); L.p("カラムラベル="+meta.getColumnLabel(i)); L.p("カラム名="+meta.getColumnName(i)); L.p("カラムタイプ(SQLタイプ)="+meta.getColumnType(i)); L.p("カラムタイプ(DB固有)="+meta.getColumnTypeName(i)); L.p("カラムサイズ="+meta.getPrecision(i)); L.p("小数点以下の桁数="+meta.getScale(i)); L.p("スキーマ名="+meta.getSchemaName(i)); L.p("テーブル名="+meta.getTableName(i)); L.p("AutoIncrement?="+meta.isAutoIncrement(i)); L.p("CaseSensitive?="+meta.isCaseSensitive(i)); L.p("キャッシュ値?="+meta.isCurrency(i)); L.p("書き込みが必ず成功するか?="+meta.isDefinitelyWritable(i)); L.p("isNullable?="+meta.isNullable(i)); L.p("isReadOnly?="+meta.isReadOnly(i)); L.p("whereで指定可能?="+meta.isSearchable(i)); L.p("isSigned?="+meta.isSigned(i)); L.p("書き込みを成功するか?="+meta.isWritable(i)); } } }
回答: 手元の PostgreSQL で確認してみましたが、確かに getMetaData() でカラムに対するテーブル名は返ってきていませんね。JDBC のインターフェイスで返ってきていない。ということは Java でその先を探るのは大変だと思います。 質問に対して期待する回答では無く、逆に質問となってしまうのですが、折角 SQL を自分で組み立てて叩いているのに、あえて省略し、曖昧な結果を捉えて、その次にどうしたいのでしょうか?その意図が知りたいです。 質問者様は実務でされていらっしゃるようですので、既に代替策も持っているだろうし、以下、言われなくても、という話だと思いますが、他の開発者様向けに書いておきます。 開発現場によっては、SELECT * での全項目列挙自体禁止しているところもあるでしょう。開発上曖昧になる省略を行う事はバグを誘発する要素にもなりうるため、あくまでも SQL にこだわるのであれば、別名定義(alias)を使えば確実に捉えられる内容ですから、厳密に書くだけではないでしょうか? まともな開発であれば、取り出した結果に対して DTO を用意すると思うのですが、SQL側の問題であるカラム名の重複を、別のレイヤーで対処するのはとても違和感があります。カラム名が重複するけれど、別な内容になる項目であれば、SQL側でカラム名の別名定義を使って項目の整理をしておき、その別名定義も DTO で捉えるのが自然なやり方ではないでしょうか? また、あくまでも省略を前提で考えているのであれば、カラム名の重複が発生しても大丈夫な(一番最後を採用する等の)読み取り時のルールを作ってしまうなり、悩みを無視できる状況そのものを仕掛けとして用意してしまえば解決できます。例えば、開発規模等に応じた SQL を極力考えなくても済むタイプの ORM を採用するなどが方法として挙げられるでしょう。