質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.58%

SQLServer 結合したテーブルデータの使用

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 3,580

Alice0225

score 190

現在、既存のWebアプリ改修を行っています。  
改修作業の中に「既存ページで表示しているデータの種類を追加」というものがあるのですが、LEFT JOINにて結合したデータの使用方法がわからず躓いてしまっております。
【環境】
Windows 7
SQLServer 2014
Java 7
Tomcat 7
Eclipse LUNA 4.4.2

SELECT     
    kokyaku.dbo.M_KOKYAKU.KOKYAKU_CD kokyakuCd,
    kokyaku.dbo.M_KOKYAKU.LAST_NAME lastName,
    kokyaku.dbo.M_KOKYAKU.FIRST_NAME firstName,
    kokyaku.dbo.M_KOKYAKU.CHU_FLG chuFlg,
    kokyaku.dbo.M_KOKYAKU.URGENCY_FLG urgencyFlg,
    MAX(kokyaku.dbo.M_RIREKI.BASE_TIME) baseTime,
    kokyaku.dbo.M_SEISANSYA.FIRST_NAME seiFirstName,
    kokyaku.dbo.M_SEISANSYA.LAST_NAME seiLastName,
    kokyaku.dbo.M_GYOUSYA.FIRST_NAME gyoFirstName,
    kokyaku.dbo.M_GYOUSYA.LAST_NAME gyoLastName
FROM 
    kokyaku.dbo.M_KOKYAKU 
    LEFT JOIN kokyaku.dbo.M_RIREKI ON kokyaku.dbo.M_KOKYAKU.KOKYAKU_CD = kokyaku.dbo.M_RIREKI.KOKYAKU_CD 
    LEFT JOIN kokyaku.dbo.M_SEISANSYA ON kokyaku.dbo.M_KOKYAKU.SEISANSYA_CD = kokyaku.dbo.M_SEISANSYA.SEISANSYA_CD 
    LEFT JOIN kokyaku.dbo.M_GYOUSYA ON kokyaku.dbo.M_KOKYAKU.GYOUSYA_CD = kokyaku.dbo.M_GYOUSYA.GYOUSYA_CD
WHERE kokyaku.dbo.M_KOKYAKU.DEL_FLG='0' and kokyaku.dbo.M_KOKYAKU.FACILI_CD = 100001
    AND kokyaku.dbo.M_KOKYAKU.CHU_FLG='0'
GROUP BY kokyaku.dbo.M_KOKYAKU.KOKYAKU_CD,
     kokyaku.dbo.M_KOKYAKU.LAST_NAME,
     kokyaku.dbo.M_KOKYAKU.FIRST_NAME,
     kokyaku.dbo.M_KOKYAKU.CHU_FLG,
     kokyaku.dbo.M_KOKYAKU.URGENCY_FLG,
     kokyaku.dbo.M_SEISANSYA.FIRST_NAME,
     kokyaku.dbo.M_SEISANSYA.LAST_NAME,
     kokyaku.dbo.M_GYOUSYA.FIRST_NAME,
     kokyaku.dbo.M_GYOUSYA.LAST_NAME
Order by kokyaku.dbo.M_KOKYAKU.LAST_KANANAME asc


上記のSQLをJava上で発行・実行し、結果をListへ返し、JSPでListデータを参照し画面上に表示するものなのですが、

SqlLogRegistry registry = SqlLogRegistryLocator.getInstance();
if (registry != null) {
    SqlLog sqlLog = registry.getLast();
    System.out.println(sqlLog.getCompleteSql());
}


を使用することで、SQLが正常に発行されていることは確認が出来ており、
SQLServer上で上記SQLを使用して正常にSELECTが行えることは確認が出来ているのですが、実際にWebアプリで使用するとエラーで止まってしまいます。(調べたところ、今回追加で取得したデータ以外は正常に通っていそうでした。)

重大: サーブレット action のServlet.service()が例外を投げました
java.sql.SQLException: 列名 'seiFirstName' が無効です。
    at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:372)
    at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2886)
    at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2328)
    at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:638)
    at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQLQuery(JtdsStatement.java:506)
    at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeQuery(JtdsPreparedStatement.java:979)
…


Entityクラスへは

/** seiFirstNameプロパティ */
@Column(name = "seiFirstName", length = 50, nullable = false, unique = false)
private String seiFirstName;

/**
 * @return seiFirstName
 */
@Deprecated
public String getSeiFirstName() {
    return seiFirstName;
}
/**
 * @param seiFirstName セットする seiFirstName
 */
@Deprecated
public void setSeiFirstName(String seiFirstName) {
    this.seiFirstName= seiFirstName;
}


のように追加で取得になるデータの追記を行いました。
上記作業で実行できるものと思い込んでいたのですが、エラーが出てしまう原因は何なのでしょうか。

有識者の方々のお力をお借りできますと幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

+1

自己解決しました。
Entityの記述方法が違っていた模様です。

/** seiFirstNameプロパティ */
@Column(name = "seiFirstName", length = 50, nullable = false, unique = false)
private String seiFirstName;

/**
 * @return seiFirstName
 */
@Deprecated
public String getSeiFirstName() {
    return seiFirstName;
}
/**
 * @param seiFirstName セットする seiFirstName
 */
@Deprecated
public void setSeiFirstName(String seiFirstName) {
    this.seiFirstName= seiFirstName;
}


@Transient
public String seiFirstName;


へ変更することで無事値の取得・表示に至りました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

例外内容は、
>java.sql.SQLException: 列名 'seiFirstName' が無効です。
SQL例外なので、実行するSQLに問題があるという判断です。

>SQLServer上で上記SQLを使用して正常にSELECTが行えることは確認が出来ている
と、いうことは、javaのプログラムが呼び出す際、
スキーマ、テーブル、カラムあたりが見えていない可能性があります。

まずは、プログラムで利用するユーザー(スキーマ)にSELECT権限があるかどうか、
ご確認ください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/07 10:39

    ご回答ありがとうございます。
    SELECT権限については問題ありませんでした。

    キャンセル

  • 2016/11/07 11:03

    そうですか・・。後は思い当たる節といえば、

    ・テーブル kokyaku.dbo.M_SEISANSYAが見えているのか?
     (シンプルに kokyaku.dbo.M_SEISANSYAだけをSELECTしてみて結果を取得できるか?)

    ・別名seiFirstNameを切った直後に、where句の中でseiFirstNameを使用すると、
     その別名がまだ有効になっていないのでSQL例外になる
     (このSQLにあとからwhere条件を追加したりしていないか?)

    ・エンティティに代入する際にエラー?
     ( nullable = falseを一旦trueで許可してみてどうか?)

    といったあたりです。

    キャンセル

  • 2016/11/08 14:30

    補足ありがとうございます。
    補足頂いた中の「・エンティティに代入する際にエラー?」が今回の自己解決に至るきっかけとなりました。
    とても助かりました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る