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

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

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

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

Spring Boot

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

Q&A

解決済

4回答

4113閲覧

SpringBootでmapに値を詰めようとするとエラーになる

takahiro00

総合スコア84

Java

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

Spring Boot

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

0グッド

1クリップ

投稿2018/11/26 13:11

編集2018/11/26 14:48

前提・実現したいこと

SpringBootでmapにDBから取得した値を格納したいのですが、
コンパイル時にエラーになります。
DBから値の取得方法はControllerクラスからサービスクラスを呼び出して、DBから値を取得しています。
ご教授いただければと思います。

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

java.lang.ClassCastException: java.util.HashMap cannot be cast to java.lang.String

該当のソースコード

java

1package com.kproject01.controller; 2 3import java.util.Collections; 4import java.util.LinkedHashMap; 5import java.util.Map; 6 7import org.springframework.beans.factory.annotation.Autowired; 8import org.springframework.stereotype.Controller; 9import org.springframework.web.bind.annotation.GetMapping; 10import org.springframework.web.servlet.ModelAndView; 11import com.kproject01.service.UserEditService; 12 13/** 14 * ユーザ編集ページのコントローラー 15 * @author takahiro 16 * 17 */ 18@Controller 19public class UserEditController { 20 21 @Autowired 22 UserEditService userEditService; 23 24 /** 25 * 初期表示 26 * @param mav 27 * @return mav 28 */ 29 @GetMapping(path = "/user-edit") 30 public ModelAndView useEdit(ModelAndView mav) { 31 //userEditService.userEditUserSelect(); 32 Map<Integer, String> getSelectedUser = 33 Collections.unmodifiableMap(new LinkedHashMap<Integer, String>() { 34 private static final long serialVersionUID = 1L; 35 Map<Integer, String> userList = userEditService.userEditUserSelect(); 36 { 37 for(Map.Entry<Integer, String>entry :userList.entrySet()){ 38 System.out.println(entry.getKey()); 39 System.out.println(entry.getValue()); 40 put(entry.getKey(), entry.getValue()); 41 } 42 } 43 }); 44 mav.setViewName("user-edit"); 45 return mav; 46 } 47} 48

xml

1<?xml version="1.0" encoding="UTF-8" ?> 2<!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5<mapper namespace="com.kproject01.mapper.UserEditMapper"> 6 <select id="userEditUserSelect" resultType="map"> 7 select 8 user_id, 9 first_nm 10 from 11 m_user 12 where 13 delete_flg = 0 14 </select> 15</mapper>

java

1package com.kproject01.mapper; 2 3import java.util.List; 4import java.util.Map; 5 6import org.apache.ibatis.annotations.MapKey; 7 8import com.kproject01.entity.UserEditUserSelect; 9import com.kproject01.entity.UserTop; 10 11/** 12 * ユーザ編集ページ 13 * @author takahiro 14 * 15 */ 16public interface UserEditMapper { 17 18 //コンボボックスに格納するユーザID、ユーザ名を取得 19 @MapKey("userId") 20 Map<Integer, String> userEditUserSelect(); 21} 22

補足情報(FW/ツールのバージョンなど)

xmlのresultTypeをhashmapにしたりエンティティにしたりしたのですが、うまくいかず
型が違うというのはなんとなく分かったのですが。。。。

java8
SpringBoot8

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

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

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

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

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

rubytomato

2018/11/26 13:41

UserEditServiceフィールドがnullなために発生している実行時エラーのように見えますが、本当にコンパイルエラーなのでしょうか? 一度このフィールドにインスタンスがセットされていることをご確認下さい。
takahiro00

2018/11/26 14:49

色々いじってたら状況が変わったので更新しました
退会済みユーザー

退会済みユーザー

2018/11/26 22:54

一応、 MyBatis / iBatis な Spring boot じゃない
退会済みユーザー

退会済みユーザー

2018/11/26 22:57

あと Spring Boot のバージョン8なんてこの世界に使ったことがある人なんていないと思うが
takahiro00

2018/11/27 10:43

間違えたSpringBoot2でした
guest

回答4

0

ベストアンサー

Mybatisの

xml

1<select id="userEditUserSelect" resultType="map">

で指定した内容で、@MapKey を使った場合、アノテーションの属性に指定した項目をキーとしたMapにresultTypeで指定した型で、検索結果が格納されます。(mapはjava.util.HashMapのエイリアス)
つまり、userIdが数値型であれば、Map<Integer, Map<String, Object>> で受け取れます。

関連ドキュメントは以下を参考に。

http://www.mybatis.org/mybatis-3/ja/getting-started.html

投稿2018/11/27 08:26

A-pZ

総合スコア12011

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

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

takahiro00

2018/11/27 10:52

返信ありがとうございます。 そうなんですねMap<Integer, Map<String, Object>> の形式になってしまうのですね・・・
A-pZ

2018/11/27 14:47

検索結果は何らかのクラス(ValueObject)に詰めることも可能です。@MapKeyのいいところは、検索結果をMapに詰め込むことで、キーに指定した内容を取り出しやすいところにあります。
guest

0

解決しました。
直接Map型にするのを諦めてList型にしてから、Map型に変換する方法で解決しました
Controllerは以下のような感じです。

java

1 @GetMapping(path = "/user-edit") 2 public ModelAndView useEdit(ModelAndView mav) { 3 //userEditService.userEditUserSelect(); 4 Map<Integer, String> getSelectedUser = 5 Collections.unmodifiableMap(new LinkedHashMap<Integer, String>() { 6 private static final long serialVersionUID = 1L; 7 List<UserEditUserSelect> userList = userEditService.userEditUserSelect(); 8 { 9 for(int i = 0; i < userList.size(); i++){ 10 int userId = userList.get(i).getUserId(); 11 String firstNm = userList.get(i).getFirstNm(); 12 put(userId, firstNm); 13 } 14 } 15 }); 16 mav.addObject("getSelectedUser", getSelectedUser); 17 mav.setViewName("user-edit"); 18 return mav; 19 }

投稿2018/11/27 13:19

takahiro00

総合スコア84

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

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

0

つMap<Integer, Map<String, Object>> userList = userEditService.userEditUserSelect();

投稿2018/11/26 21:05

編集2018/11/26 21:38
hichon

総合スコア5737

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

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

hichon

2018/11/26 21:40

勘違いしていたので訂正。Valueの方にはSelect結果が詰め込まれるはず。
takahiro00

2018/11/27 10:53

返信ありがとうございます。 そうなんですねMap<Integer, Map<String, Object>> の形式になってしまうのですね・・・
guest

0

plain

1java.lang.ClassCastException: java.util.HashMap cannot be cast to java.lang.String

文言通り、HashMapをStringにキャストしようとして失敗しているようです。
しかしコード上でそのようなキャストを明示的に行っているところがないので、
怪しいのはuserEditService.userEditUserSelect()で取ってきてるMapが
実はMap<Integer, HashMap<?, ?>>なのではないかということ。

ちなみに

わざわざforて回さなくても、コンストラクタにMapを渡すだけで(デバッグ用の出力を除き)Mapのコピーを作れます。

java

1 Map<Integer, Map<String, Object>> getSelectedUser = 2 Collections.unmodifiableMap(new LinkedHashMap<Integer, Map<String, Object>>(userEditService.userEditUserSelect());

投稿2018/11/26 20:44

編集2018/11/27 13:53
swordone

総合スコア20651

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

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

takahiro00

2018/11/27 10:53

返信ありがとうございます。 そうなんですねMap<Integer, Map<String, Object>> の形式になってしまうのですね・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問