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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

1回答

4020閲覧

Osqleditでselectできるのに、java(eclipse)ではselectできずで困っています。

Y.Mamoru

総合スコア47

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2020/10/20 01:16

編集2020/10/20 01:57

〇やりたいこと
javaのactionクラスからSELECT文を実行して、その結果を取得したい。

〇困っていること
SELECTの結果が空で返ってくる。

同様のSQL文をOSqleditで実行すると値が取れます。
(SQL文はコピペをOSqleditに貼り付け、間の空白まで確認しているので、SQL文自体は両方とも会っているはずです)

〇考えて試していること
OSqleditとeclipseで実行の仕方が違うのでは?と考えて、
両社の違いや、実行結果が違う事例を探しているのですが、
なかなか見つかりません。

わかる方よろしくお願いします。
極力コメントにも現状を書いておきました。

※※追記※※
バインドさせずにcreateStatementを使って、SQL文に直接変数を入れれば正常に値は取れました。
ただバインドを使って正常に動かす方法を知りたいです。
よろしくお願いします。

SQL文のあるjavaクラス

java

1package list; 2 3import java.sql.Connection; 4import java.sql.PreparedStatement; 5import java.sql.ResultSet; 6import java.util.ArrayList; 7import java.util.List; 8 9import javax.servlet.http.HttpServletRequest; 10import javax.servlet.http.HttpServletResponse; 11 12import org.apache.struts.action.Action; 13import org.apache.struts.action.ActionForm; 14import org.apache.struts.action.ActionForward; 15import org.apache.struts.action.ActionMapping; 16 17import database.DBManager; 18import model.UserActionForm; 19 20public class AttendanceList extends Action { 21 public ActionForward execute 22 (ActionMapping mapping , 23 ActionForm form , 24 HttpServletRequest request , 25 HttpServletResponse response) 26throws Exception{ 27 28 //プルダウンの値を受け取る 29 UserActionForm uaf = (UserActionForm)form; 30 String sectionID = uaf.getSectionID(); 31 System.out.println(sectionID);//Stringの引数が確実に入っていることを確認済み。ここでは"A"。 32 33 try { 34 //受けた値でselectする(JOINする必要あり。大本はm_user。部署IDで絞って、m_userからユーザーネーム、t_timeから勤務時間をとる) 35 String sql = "SELECT M_USER.NAME , T_TIME.STAMP_TIME " 36 + "FROM M_USER " 37 + "INNER JOIN T_TIME " 38 + "ON M_USER.USER_ID = T_TIME.USER_ID " 39 + "WHERE M_USER.SECTION_ID = ?"; 40 Connection conn = DBManager.getConnection(); 41 PreparedStatement smt = conn.prepareStatement(sql); 42 smt.setString(1, sectionID); 43 System.out.println(sql);//ここで表示されるSQL文を基にOSqleditも実行して今うが、2件のデータをとることができています。 44 ResultSet rs = smt.executeQuery(); 45 46 //結果をlistに格納する 47 List<UserActionForm> list = new ArrayList<UserActionForm>(); 48 while(rs.next()) { //rs.next()の結果がfalseになるので、while文の中には入らないです。 49 System.out.println("pass"); 50 UserActionForm uaf2 = new UserActionForm(); 51 uaf2.setName(rs.getString("NAME")); 52 uaf2.setTime(rs.getTimestamp("STAMP_TIME")); 53 list.add(uaf2); 54 System.out.println(rs.getString("NAME")); 55 } 56 57 //listを画面へ返す。 58 request.setAttribute("list" , list);//遷移先でlistの中身を確認すると[]になっています。またlist.size()は0です。 59 return (mapping.findForward("toMonthList")); 60 61 }catch(Exception e) { 62 System.out.println(e); 63 return (mapping.findForward("error")); 64 } 65} 66} 67

M_USERテーブル
(実際はもっとカラム数もありますが、今回関係するところだけ抜き出しています。)

USER_IDSECTION_IDNAME
1Aname
2A田中
3Amata
4Aname

T_TIMEテーブル

USER_IDSTAMP_TIME
12020-10-19 00:00:00
12020-10-19 00:00:00

OSqleditでjavaと同様のSQLを実行すると以下の結果を取れます。

NAMESTAMP_TIME
name2020-10-19 00:00:00
name2020-10-19 00:00:00

2件の結果を取得できます。

アドバイスをお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/10/20 01:29

joinなし絞り込みなしカラムも*で単体selectした場合はどうでしょうか
Y.Mamoru

2020/10/20 01:45

select * from M_USER;で実行すると(テーブルに含まれるNAMEだけですが)値は取れます。 さらに、おもむろに以下のSQLを実行してみました。 SELECT M_USER.NAME , T_TIME.STAMP_TIME FROM M_USER INNER JOIN T_TIME ON M_USER.USER_ID = T_TIME.USER_ID WHERE M_USER.SECTION_ID = ’A'; javaに直書きです。 これを実行するとほしい値をとることができました。
Y.Mamoru

2020/10/20 01:51

createStatementを使って、 最後の絞り込みを "WHERE M_USER.SECTION_ID ='" + sectionID + "'"; を書いても正常に値をとることができました! ただバインドでできない理由がわからないです(><)
q_sane_q

2020/10/20 02:55

これDBはOracleですかね M_USER.SECTION_ID がCHAR型で「A」の後ろが空白埋めされていたりはしませんか?
deaf_tadashi

2020/10/20 04:01

ロジックは問題無いように見受けられるので、あとは繋いでいるDBが思っていたのと違うところだった、というのを疑ってみます。
Y.Mamoru

2020/10/20 04:06

@q_sane_qさん はい!DBはOracleで、M_USER.SECTION_IDはCHAR型です! すみません。空白埋め、はコードの中のどこで起こる可能性がありますでしょうか?(^^; バインドする?の後ろとかでしょうか。
Y.Mamoru

2020/10/20 04:07

@deaf_tadashiさん やはりそうですよね。 繋いでいるDBは、(念のため再度確認しましたが)、間違いありませんでした(><)
q_sane_q

2020/10/20 04:20

CHAR型は固定長なので、INSERT時に足りない分を勝手に空白で埋めてしまったと思います。 で、少なくともOracleではCHAR型の列ではその空白をWHERE句に書かなくてもイコールであると判断する…という挙動をしたと思います。 その挙動をPreparedStatementがフォローできていない可能性があるのでは。
q_sane_q

2020/10/20 04:24

つまりSELECTを直で発行すると 'A 'は'A'で検索かけても引っかかるという挙動
Y.Mamoru

2020/10/20 05:45

@q_sane_qさん なるほど。そのような挙動があったのですね。 書いてくださった内容で少し調べてみました。確かにoracle特有の機能が働いているようですね(><) もう少し調べながら進めてみます!
guest

回答1

0

ベストアンサー

動作確認はできていませんが、OracleDBのCHAR型を検索する場合は、OraclePreparedStatementを利用し、setFixedCHARで指定する、とあります。

https://docs.oracle.com/cd/E16338_01/java.112/b56281/datacc.htm#BABCHGCH:WHERE句にCHARデータをバインドするためのメソッドsetFixedCHAR

コードの実装例もありますので試してみては。

投稿2020/10/20 04:49

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y.Mamoru

2020/10/20 05:49

ありがとうございます! 貼ったページを見て、(まだ完全ではないですが)、わかってきました(^^)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問