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

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

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

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

Spring

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

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Q&A

0回答

793閲覧

java spring 検索結果をリストで取得し、出力したい

saten_sumi

総合スコア1

Java

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

Spring

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

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

0グッド

0クリップ

投稿2022/05/25 10:40

編集2022/05/26 02:45

java歴2ヶ月程度の初心者です。springを利用して、DBの値を取得し、検索結果をリストで出力するプログラムを作成しています。
しかし、デバッグをした際に、リストに値が格納されず、データベースからの検索が失敗する状態です。

ソース自体は前に作った成功サンプルをほぼそのまま使っているので、間違ってないと思うのですが……。sql文もA5M2で動作を確認し、検索は全てできることを確認しています。もしかしたら自分のエクリプス側のシステムの問題では?とも思いましたが、もしソースに間違いがあったら教えて頂きたいです。

ゲームにおけるユニット編成のようなシステムを作ろうとしています。
ex)ユーザーがカードの検索条件(条件が1つのみでも検索可能)を入力すると、条件を元にユーザーが登録しているカードの中でtotal(総合力)の大きい順に5名でユニットを編成する。

まだエラー処理やセッション破棄などは行っておらず、検索結果取得のみを行っている段階です。
ログインやユーザー登録に関係するコントローラーは別で作成しており、本件とは関係がないと思いましたので記載しておりません。

【現在の状況】
・検索画面にて、レアリティとカード属性の2つを選択(この組み合わせのみでしか検索が成功しません。)→検索に成功。リストに検索結果が格納され、5名でユニット編成。
・検索画面にて、レアリティのみ(レアリティにかかわらず、条件を1つのみ選択)を選択→検索結果がリストに格納されず、検索結果のhtmlに表記してある「編成条件に当てはまるカードが存在しませんでした。」が出力される。テーブルにはカード情報がいくつも入っているので、ここで出力されないのはおかしい。
・クリーンやリフレッシュは何度もしている。

いろんな方に聞きましたが、なおらず苦戦しています。
こちらでの質問がはじめてなので、もし足りないプログラムなどがあれば追記しますので、おっしゃっていただければと思います。よろしくお願いいたします。

ユニット編成を行うためのコントローラー import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.SessionAttributes; import com.example.domain.CardInfo; import com.example.domain.LoginCardUser; import com.example.domain.SearchCard; import com.example.service.CardSearchService; @Controller @SessionAttributes("unitMakeForm") public class UnitMakeController { //サービスクラス実装 @Autowired private CardSearchService service; //ユーザー情報 @Autowired private LoginCardUser loginCardUser; @ModelAttribute(value = "unitMakeForm") public UnitMakeForm setForm() { return new UnitMakeForm(); } @RequestMapping("/unitMakeForm") public String UnitMakeForm(Model model) { UnitMakeForm unitMakeForm = new UnitMakeForm(); model.addAttribute("unitMakeForm", unitMakeForm); return "card/unitMake"; } //一部省略 //⑥-1 ユニット編成画面から編成結果画面へ @GetMapping("/unitMakeResult") @RequestMapping(value = "/unitMakeResult", params = "unitResult") public String resultList(@ModelAttribute("unitMakeForm") UnitMakeForm form, Model model) { model.addAttribute("userName", loginCardUser.getUserName()); // データ検索に利用するドメインクラスのインスタンス化 SearchCard searchCard = new SearchCard(); form.setUserName(login```ここに言語を入力 コード ```CardUser.getUserName()); // Formクラスの値をドメインクラスにコピー BeanUtils.copyProperties(form, searchCard); // 編成を行うためのサービス処理呼び出し List<CardInfo> list = service.searchCardInfo(searchCard); // Modelオブジェクトに検索結果を格納 model.addAttribute("unitMakeList", list); return "card/unitMakeResult"; }  //省略
カード情報が入っているカードテーブル create table card( id INT AUTO_INCREMENT PRIMARY KEY, rarity INT(1) NOT NULL, card_type INT(1) NOT NULL, chara_name VARCHAR(10) NOT NULL, card_title VARCHAR(20) NOT NULL, total INT NOT NULL, user_name VARCHAR(8) NOT NULL, create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY(user_name) REFERENCES card_user(user_name) );
このdomainを使ってリストに値を格納します。 package com.example.domain; import java.io.Serializable; public class CardInfo implements Serializable { // serialVersionUIDを指定 private static final long serialVersionUID = 1L; //レアリティ public String rarity; //カード属性 public String cardType; //キャラクター名 public String charaName; //総合力 public int total; //ユーザーID public String userName;  //getter,setter省略 }
コントローラーでModelAttributeしているform import java.io.Serializable; public class UnitMakeForm implements Serializable{ private static final long serialVersionUID = 1L; //レアリティ public String searchRarity; //カード属性 public String searchCardType; //キャラクター名 public String searchCharaName; //総合力 public int searchMinTotal; public int searchMaxTotal; //ユーザーID public String userName; //getter,setter省略
検索を行うためのdomain import java.io.Serializable; public class SearchCard implements Serializable{ private static final long serialVersionUID = 1L; //レアリティ public String searchRarity; //カード属性 public String searchCardType; //キャラクター名 public String searchCharaName; //総合力 public int searchMinTotal; public int searchMaxTotal; //ユーザーID public String userName; //getter,setter省略
サービスクラス import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.example.domain.Card; import com.example.domain.CardInfo; import com.example.domain.SearchCard; import com.example.persistence.CardSearchMapper; @Service public class CardSearchService { @Autowired //カードテーブルmapper private CardSearchMapper mapper; // ユニット編成処理メソッド public List<CardInfo> searchCardInfo(SearchCard searchCard) { // データ検索 List<CardInfo> list = mapper.select(searchCard); return list; } }
mapper import java.util.List; import com.example.domain.Card; import com.example.domain.CardInfo; import com.example.domain.SearchCard; public interface CardSearchMapper { //ユニット編成 public List<CardInfo> select(SearchCard searchCard); }
mapper.xml 該当のselect文のみ抜粋 <select id="select" resultType="com.example.domain.CardInfo"> <bind name="pNameLike" value="'%' + searchCharaName + '%'"/> SELECT rarity,card_type,chara_name,total,user_name FROM forte_kawakami.card <where> card.user_name=#{userName} <if test="searchRarity != '' or searchRarity != null"> AND rarity = #{searchRarity} </if> <if test="searchCardType != '' or searchCardType != null"> AND card_type = #{searchCardType} </if> <if test="searchCharaName != '' or searchCharaName != null"> AND chara_name LIKE #{pNameLike} </if> <if test="searchMinTotal != null or searchMinTotal != ''"> <![CDATA[ AND total >= #{searchMinTotal} ]]> </if> <if test="searchMaxTotal != null or searchMaxTotal != ''"> <![CDATA[ AND total <= #{searchMaxTotal} ]]> </if> </where> ORDER BY total DESC LIMIT 5; </select>
ユニットを編成(検索を行う)するhtml <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>ユニット編成</title> </head> <body> <div align="center"> <h1>ユニット編成</h1> <p>編成条件を入力してください。</p> <form th:action="@{/unitMakeResult}" th:object="${unitMakeForm}" method="post"> <table> <tr> <td>レアリティ</td> <td> <input type="radio" th:field="*{SearchRarity}" value="UR" />UR <input type="radio" th:field="*{SearchRarity}" value="SR" />SR <input type="radio" th:field="*{SearchRarity}" value="R" />R <input type="radio" th:field="*{SearchRarity}" value="N" />N</td> </tr> <tr> <td>カード属性</td> <td> <input type="radio" th:field="*{SearchCardType}" value="スマイル" />スマイル <input type="radio" th:field="*{SearchCardType}" value="ピュア" />ピュア <input type="radio" th:field="*{SearchCardType}" value="クール" />クール</td> </tr> <tr> <td>キャラクター名</td> <td><input type="text" th:field="*{SearchCharaName}" maxlength="10"/></td> </tr> <tr> <td>総合力</td> <td> <input type="number" th:field="*{SearchMinTotal}" maxlength="5"/> <input type="number" th:field="*{SearchMaxTotal}" maxlength="5"/> </td> </tr> </table> <!-- ユニット編成結果へ --> <input type="submit" name="unitResult" value="編成" /> <br> <!-- カード検索画面へ --> <input type="submit"name="unit_search" value="カード検索" /><br> <!-- メニュー画面へ戻る --> <input type="submit"name="unit_back" value="戻る" /> </form> </div> </body> </html>
検索結果を表示するhtml <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>編成結果</title> </head> <body> <div align="center"> <h1>編成結果</h1> <form th:action="@{/cardMenu}" th:object="${unitMakeForm}" method="post"> <div th:if="${unitMakeList} and ${unitMakeList.size()} == 0"> <p>編成条件に当てはまるカードが存在しませんでした。</p> </div> <div th:if="${unitMakeList} and ${unitMakeList.size()} > 0"> <p>編成結果は以下の通りです。</p> <table border="1"> <tr> <th>レアリティ</th> <th>カード属性</th> <th>キャラクター名</th> <th>総合力</th> </tr> <tr th:each="cardInfo : ${unitMakeList}"> <td th:text="${cardInfo.rarity}"></td> <td th:text="${cardInfo.cardType}"></td> <td th:text="${cardInfo.charaName}"></td> <td th:text="${cardInfo.total}"></td> </tr> </table> </div> <!-- 編成画面へ戻る --> <input type="submit"name="unitMake_back" value="戻る" /><br> <!-- メニュー画面へ戻る --> <input type="submit"name="unitMake_menu" value="メニューへ" /> </form> </div> </body> </html>

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

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

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

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

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

dodox86

2022/05/25 11:20

Springは分からないのですけど、 > 検索画面にて、レアリティのみ(レアリティにかかわらず、条件を1つのみ選択)を選択→検索結果がリストに格納されず、 質問文からは区別できませんでしたが、 ・検索はできて成功しているのだけど、リストに正しく格納されていない。 ・検索はできて成功しているのだけど、結果0件でリストも結局、空。 ・検索自体ができていない(失敗)のでリストに格納されない。 など、区別はできていてその辺りは突き止めていますか。そこから確認すべきのような。 ※Springに詳しい方なら、ご提示のコードを見て分かるのかもしれませんが。
saten_sumi

2022/05/25 12:29

ありがとうございます。 3点の中でしたら、3点目が今の失敗時の状況に近いように思えます。 コントローラーの以下の部分↓ // Modelオブジェクトに検索結果を格納 model.addAttribute("unitMakeList", list); にブレークポイントをつけてデバッグを行ったところ、検索結果が表示される場合でもされない場合でもformとdomainクラスには値が格納されていましたが、検索結果が表示されない場合はリストの値が空になっており、検索結果がリストに格納されていないという状況です。検索の成功時はリストに検索結果の値が入っていることを確認しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問