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

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

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

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

254閲覧

SpringでIN句指定した条件で検索できない

hfuob

総合スコア9

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2024/11/26 05:18

実現したいこと

SpringでIN句で条件を指定しましたが、結果がNULLとなっていますのでそのバグを解消したいです。

発生している問題・分からないこと

List<KintaiList> kintaiList = jdbc.query(sql, rowMapper, args);
で検索した時に結果が無い(NULLとなっています。)

該当のソースコード

Java

1 @PostMapping("/searchAll") 2 public String searchEach(@ModelAttribute SyainSV SyainSVData 3 , Kihon1 kihon1, Syain syain, Model model) { 4 5 String syain_id1 = SyainSVData.getSyain_id1(); 6 String syain_id2 = SyainSVData.getSyain_id2(); 7 String syain_id3 = SyainSVData.getSyain_id3(); 8 String syain_id4 = SyainSVData.getSyain_id4(); 9 String syain_id5 = SyainSVData.getSyain_id5(); 10 List<String> array = new ArrayList(Arrays.asList(syain_id1, syain_id2, syain_id3, syain_id4, syain_id5)); 11 array.removeAll(Arrays.asList("", null)); 12 13 String where_str = "'"; 14 for (int i = 0; i < array.size();i++) { 15 16 if (!StringUtils.isEmpty(array.get(i))) { 17 where_str = where_str + array.get(i); 18 where_str = where_str + "'"; 19 } 20 21 if(i == array.size() - 1) { 22 break; 23 } 24 where_str = where_str + ", '"; 25 } 26 27 StringBuilder sql_buil = new StringBuilder(); 28 sql_buil.append("SELECT syain.syain_id, kihon1.kihon_name, kihon1.mei_st" 29 + ", kihon1.mei_ed, kihon1.kinmu_st, kihon1.kinmu_ed "); 30 sql_buil.append("FROM syain "); 31 sql_buil.append(" INNER JOIN kihon1 "); 32 sql_buil.append(" ON kihon1.kihon_id = syain.syain_id "); 33 if (!StringUtils.isEmpty(where_str)) { 34 sql_buil.append("WHERE syain.syain_id IN (?)"); 35 } 36 String sql = sql_buil.toString(); 37 Object[] args = new Object[] {where_str}; 38 BeanPropertyRowMapper<KintaiList> rowMapper = BeanPropertyRowMapper.newInstance(KintaiList.class); 39 List<KintaiList> kintaiList = jdbc.query(sql, rowMapper, args); 40 model.addAttribute("list", kintaiList); 41 42 return "index"; 43 }

Java

1package jp.winschool.spring.sample09; 2 3import lombok.Data; 4 5@Data 6public class KintaiList { 7 private String syain_id; 8 private String kihon_name; 9 private String mei_st; 10 private String mei_ed; 11 private String kinmu_st; 12 private String kinmu_ed; 13} 14

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

IN句に設定した条件がwhere_str=1,2でもwhere_str='1','2'でも検索できませんでした。

補足

特になし

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

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

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

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

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

juner

2024/11/26 05:56 編集

where_str に シングルクオーテーションで囲わずに一つの値を入れた場合はうまくいきいませんでしょうか? プレースホルダーだと普通は引用符で囲わない気がするのですが。
hfuob

2024/11/26 06:29

where_str = "1,2"にした場合でも同じでした。
juner

2024/11/26 06:36 編集

違います。 where_str = "1" の時です 多分 where_str = "1, 2" だと SQLとしては `syain.syain_id IN ('1, 2')` として検索していると思われます where_str = "'1','2'" にしても SQL としては `syain.syain_id IN ('''1'',''2''')` として ' が エスケープされて '' になって挿入されているものと思われます (厳密にはSQLにエスケープされて挿入されていないかもしれませんが、概念的にはこれなのでこう説明します。(挿入変数は SQLに展開されるのではなくて値として展開される為
guest

回答1

0

ベストアンサー

このソースで実行されるSQLは、こんな感じですかね。

sql

1SELECT syain.syain_id, kihon1.kihon_name, kihon1.mei_s... 2 ... 3 WHERE syain.syain_id IN ('''1'',''2'',''3'',''4'',''5''')

これが目論見とおりなら、以下は読み捨ててください。


jdbcがどんな型なのか読み取れないので、なんとも言えませんが。

まず、sqlがこんなカタチになるように直しましょう。?の数が、array.size()と同じになるように。

sql

1SELECT syain.syain_id, kihon1.kihon_name, kihon1.mei_s... 2 ... 3 WHERE syain.syain_id IN (?, ?, ?, ?, ?)

# たとえば、IntStram.range(0, array.size()).mapToObj(_ -> "?").collect(Collectors.joining(","))

そして、

java

1 Object[] args = new Object[] {where_str};

ではなく、こうする。

java

1 Object[] args = array.toArray();

たぶん、そんな感じかと。

投稿2024/11/26 06:28

編集2024/11/26 06:45
shiketa

総合スコア4061

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問