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

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

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

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

Spring

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

MyBatis

MyBatisはJavaや.NET Frameworkでなどで使用できる、SQL文や、ストアドプロシージャをオブジェクトと紐付けるO/Rマッピングフレームワークです。

Q&A

解決済

1回答

3254閲覧

【Spring MyBatis】入力値を元にDBのDate型カラムに対して検索かけたい

S.niranira

総合スコア19

Java

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

Spring

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

MyBatis

MyBatisはJavaや.NET Frameworkでなどで使用できる、SQL文や、ストアドプロシージャをオブジェクトと紐付けるO/Rマッピングフレームワークです。

0グッド

0クリップ

投稿2018/04/20 05:55

前提・実現したいこと

入力値「開始日」「終了日」をもとにDBのレコード内Date型カラムに対し、
開始日と終了日の範囲内に存在するレコードの検索をかけたいのですが、
SQLを実行した際にエラーとなり検索ができませんでした。

発生している問題・エラーメッセージ

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'stratDate' not found. Available parameters are [kokyakuName, keiyakuName, endDate, param3, param4, param1, startDate, param2]

※適当な部分で改行を入れています。

該当のソースコード

JSP

html

1<!DOCTYPE html> 2<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 3<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 4<%@ taglib prefix="f" uri="http://www.springframework.org/tags/form"%> 5<html> 6 <head> 7 <meta charset="utf-8"> 8 <title>proto-type</title> 9 </head> 10 <f:form modelAttribute="allSelectForm"> 11 <body> 12 <h2>proto-type</h2> 13 <form method="post"> 14 <input type="submit" name="selectAll" value="全件取得" style="margin: 10px; " /> 15 <input type="submit" name="selectAll" value="登録" style="margin: 10px; " /> 16 <input type="submit" name="selectAll" value="削除" style="margin: 10px; " /> 17 <table class="input" border="1"> 18 <tr> 19 <td>顧客名</td> 20 <td><f:input path="inputKokyakuName" /></td> 21 <td>サービス名</td> 22 <td><f:input path="inputKeiyakuName" /></td> 23 </tr> 24 <tr> 25 <td>登録日</td> 26 <td colspan="3"><f:input path="inputStartDate" /><f:input path="inputEndDate" /></td> 27 </tr> 28 </table> 29 <input type="submit" name="selectInput" value="検索" style="margin: 10px; " /> 30 </form> 31 <h5>${message}</h5> 32 <table class="list" border="1"> 33 <tr> 34 <td>顧客コード</td> 35 <td>顧客名</td> 36 <td>顧客住所</td> 37 <td>サービス名</td> 38 <td>サービス料</td> 39 <td>キャンペーン</td> 40 <td>割引キャンペーン料</td> 41 </tr> 42 <c:if test="${result != null}"> 43 <c:forEach var="data" items="${result}"> 44 <tr> 45 <td><c:out value="${data.kokyakuCode}" /></td> 46 <td><c:out value="${data.kokyakuName}" /></td> 47 <td><c:out value="${data.kokyakuAddress}" /></td> 48 <td><c:out value="${data.keiyakuName}" /></td> 49 <td><c:out value="${data.keiyakuPrice}" /></td> 50 <td><c:out value="${data.campaignName}" /></td> 51 <td><c:out value="${data.campaignPrice}" /></td> 52 </tr> 53 </c:forEach> 54 </c:if> 55 </table> 56 </f:form> 57 </body> 58</html>

Form

java

1package jp.sample.billing.form; 2import java.util.List; 3import jp.deloitte.maplus.billing.entity.Kokyakutbl; 4import lombok.Data; 5@Data 6public class AllSelectForm { 7 // String 8 private String inputKokyakuName; 9 private String inputKeiyakuName; 10 private String inputStartDate; 11 private String inputEndDate; 12 // List 13 private List<Kokyakutbl> result; 14 // Getter-Setter 15 public String getInputKokyakuName() { 16 return inputKokyakuName; 17 } 18 public void setInputKokyakuName(String inputKokyakuName) { 19 this.inputKokyakuName = inputKokyakuName; 20 } 21 public String getInputKeiyakuName() { 22 return inputKeiyakuName; 23 } 24 public void setInputKeiyakuName(String inputKeiyakuName) { 25 this.inputKeiyakuName = inputKeiyakuName; 26 } 27 public String getInputStartDate() { 28 return inputStartDate; 29 } 30 public void setInputStartDate(String inputStartDate) { 31 this.inputStartDate = inputStartDate; 32 } 33 public String getInputEndDate() { 34 return inputEndDate; 35 } 36 public void setInputEndDate(String inputEndDate) { 37 this.inputEndDate = inputEndDate; 38 } 39 public List<Kokyakutbl> getResult() { 40 return result; 41 } 42 public void setResult(List<Kokyakutbl> result) { 43 this.result = result; 44 } 45}

Controller

java

1package jp.sample.billing.controller; 2import java.util.List; 3import org.springframework.beans.factory.annotation.Autowired; 4import org.springframework.context.annotation.Import; 5import org.springframework.stereotype.Controller; 6import org.springframework.ui.Model; 7import org.springframework.web.bind.annotation.GetMapping; 8import org.springframework.web.bind.annotation.ModelAttribute; 9import org.springframework.web.bind.annotation.RequestMapping; 10import org.springframework.web.bind.annotation.RequestMethod; 11import jp.deloitte.maplus.billing.entity.Kokyakutbl; 12import jp.deloitte.maplus.billing.form.AllSelectForm; 13import jp.deloitte.maplus.billing.service.AllSelectService; 14@Controller 15@Import(AllSelectService.class) 16@RequestMapping("/prototype") 17public class AllSelectController { 18 @Autowired 19 private AllSelectService ASS; 20 // GETアクセス 21 @GetMapping 22 public String getAccess( 23 @ModelAttribute("allSelectForm") AllSelectForm allSelectForm, 24 Model model){ 25 model.addAttribute("message", "顧客情報一覧表示"); 26 return "allSelect"; 27 } 28 // POSTアクセス 29 @RequestMapping(params="selectAll", method=RequestMethod.POST) 30 public String postAccess( 31 @ModelAttribute("allSelectForm") AllSelectForm allSelectForm, 32 Model model){ 33 List<Kokyakutbl> resultList = ASS.selectListByAll(); 34 if(resultList.size()>0){ 35 model.addAttribute("message", resultList.size()+"件取得できました。"); 36 } else { 37 model.addAttribute("message", "取得できませんでした。"); 38 } 39 model.addAttribute("result", resultList); 40 return "allSelect"; 41 } 42 @RequestMapping(params="selectInput", method=RequestMethod.POST) 43 public String postSearch( 44 @ModelAttribute("allSelectForm") AllSelectForm allSelectForm, 45 Model model){ 46 List<Kokyakutbl> resultList = ASS.selectListByInput(allSelectForm.getInputKokyakuName() 47 , allSelectForm.getInputKeiyakuName() 48 , allSelectForm.getInputStartDate() 49 , allSelectForm.getInputEndDate() 50 ); 51 if(resultList.size()>0){ 52 model.addAttribute("message", resultList.size()+"件取得できました。"); 53 } else { 54 model.addAttribute("message", "取得できませんでした。"); 55 } 56 model.addAttribute("result", resultList); 57 return "allSelect"; 58 } 59}

Service

java

1package jp.sample.billing.service; 2import java.util.List; 3import org.springframework.beans.factory.annotation.Autowired; 4import org.springframework.stereotype.Service; 5import org.springframework.transaction.annotation.Transactional; 6import jp.deloitte.maplus.billing.entity.Kokyakutbl; 7import jp.deloitte.maplus.billing.mapper.KokyakutblMapper; 8@Service 9public class AllSelectService { 10 @Autowired 11 private KokyakutblMapper KMap; 12 // GETアクセス 13 @Transactional 14 public List<Kokyakutbl> selectListByAll(){ 15 return KMap.selectListByAll(); 16 } 17 @Transactional 18 public List<Kokyakutbl> selectListByInput(String kokyakuName 19 , String keiyakuName 20 , String startDate 21 , String endDate 22 ){ 23 return KMap.selectListByInput(kokyakuName 24 , keiyakuName 25 , startDate 26 , endDate 27 ); 28 } 29}

Mapper

java

1package jp.sample.billing.mapper; 2import java.util.List; 3import org.apache.ibatis.annotations.Param; 4import org.apache.ibatis.annotations.Select; 5import org.apache.ibatis.annotations.SelectProvider; 6import org.apache.ibatis.jdbc.SQL; 7import org.springframework.util.StringUtils; 8import jp.deloitte.maplus.billing.entity.Kokyakutbl; 9public interface KokyakutblMapper { 10 @Select("SELECT" 11 + " K1.no AS no," 12 + " K1.kokyaku_code AS kokyakuCode," 13 + " K1.kokyaku_name AS kokyakuName," 14 + " K1.kokyaku_address AS kokyakuAddress," 15 + " K2.keiyaku_name AS keiyakuName," 16 + " K2.keiyaku_price AS keiyakuPrice," 17 + " W1.campaign_name AS campaignName," 18 + " W1.campaign_price AS campaignPrice" 19 + " FROM" 20 + " Kokyakutbl K1," 21 + " Keiyakutbl K2," 22 + " Waribikitbl W1" 23 + " WHERE" 24 + " K1.kokyaku_code = K2.kokyaku_code" 25 + " AND" 26 + " K1.kokyaku_code = W1.kokyaku_code") 27 List<Kokyakutbl> selectListByAll(); 28 @SelectProvider(type = SqlProvider.class, method = "selectListByInput") 29 List<Kokyakutbl> selectListByInput(@Param("kokyakuName") String kokyakuName 30 , @Param("keiyakuName") String keiyakuName 31 , @Param("startDate") String startDate 32 , @Param("endDate") String endDate 33 ); 34 static class SqlProvider extends SQL{ 35 public String selectListByInput (@Param("kokyakuName") String kokyakuName 36 , @Param("keiyakuName") String keiyakuName 37 , @Param("startDate") String startDate 38 , @Param("endDate") String endDate 39 ){ 40 SELECT("K1.no AS no," 41 + " K1.kokyaku_code AS kokyakuCode," 42 + " K1.kokyaku_name AS kokyakuName," 43 + " K1.kokyaku_address AS kokyakuAddress," 44 + " K2.keiyaku_name AS keiyakuName," 45 + " K2.keiyaku_price AS keiyakuPrice," 46 + " W1.campaign_name AS campaignName," 47 + " W1.campaign_price AS campaignPrice"); 48 FROM("Kokyakutbl K1," 49 + "Keiyakutbl K2," 50 + "Waribikitbl W1"); 51 if(!StringUtils.isEmpty(kokyakuName)){ 52 WHERE("K1.kokyaku_name like CONCAT('%',#{kokyakuName},'%')"); 53 } 54 if(!StringUtils.isEmpty(keiyakuName)){ 55 WHERE("K2.keiyaku_name like CONCAT('%',#{keiyakuName},'%')"); 56 } 57 if(!StringUtils.isEmpty(startDate)){ 58 WHERE("K1.kokyaku_insdate >= ('%',#{stratDate},'%')"); 59 } 60 if(!StringUtils.isEmpty(endDate)){ 61 WHERE("K1.kokyaku_insdate <= ('%',#{endDate},'%')"); 62 } 63 WHERE("K1.kokyaku_code = K2.kokyaku_code"); 64 WHERE("K1.kokyaku_code = W1.kokyaku_code"); 65 String sb = toString(); 66 return sb; 67 } 68 } 69}

よろしくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/04/20 06:29

DATE 型とDATE 型に変換できない文字列型では比較はできません
S.niranira

2018/04/20 06:32 編集

ありがとうございます。 入力値としては「YYYY/MM/DD」をString型で受け取るつもりでいます。実際にはJavaScriptなどでカレンダーで日付を選択して検索をかけようと考えています。
退会済みユーザー

退会済みユーザー

2018/04/20 06:36

WHERE("K1.kokyaku_insdate >= ('%',#{stratDate},'%')"); これが?
S.niranira

2018/04/20 06:44

そうですね。 デバッグモードで確認した際には「('%',#{stratDate},'%')")」に 例)2016/01/01 と入っている状態です。
guest

回答1

0

ベストアンサー

エラーメッセージに下記のように書いてありますので

Parameter 'stratDate' not found. Available parameters are [kokyakuName, keiyakuName, endDate, param3, param4, param1, startDate, param2]

SQLに渡すParameterの stratDatestartDateの書き間違いかと思います。
あとはどこで間違っているか見つけてみては?

投稿2018/04/20 22:05

euledge

総合スコア2404

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

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

S.niranira

2018/04/23 01:00

ご指摘ありがとうございます。 Mapperの入力値をWhere句に詰める部分「('%',#{stratDate},'%')」が間違っていました。。。修正をしたところ上記の事象は解消されました(別のエラーが発生しましたが…)。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問