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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

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

MyBatis

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

Spring Boot

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

Q&A

解決済

1回答

3538閲覧

MySQLとJavaでの真偽値のマッピングが上手くいかず、全てfalseがEntityに入ってしまう。

ochosiken

総合スコア2

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

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

MyBatis

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

Spring Boot

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

0グッド

0クリップ

投稿2020/06/16 01:01

前提・実現したいこと

「春日語」という日本語の略語のような単語のテーブルを MySQL に作成し、Spring Boot + MyBatis で接続して単語の一覧を画面に表示させるだけの
非常に簡易的なアプリケーションを制作しています。

作成したテーブルのフィールドは

+----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+----------------+ | id | int | NO | PRI | NULL | auto_increment | | hyojungo | varchar(20) | NO | | NULL | | | kasugago | varchar(20) | NO | | NULL | | | lank | varchar(10) | NO | | NULL | | | four_flg | bit(1) | NO | | NULL | | +----------+-------------+------+-----+---------+----------------+

このように設定されています。
一番下のフィールドである four_flg で真偽値を管理していて、bit(1)と指定してあげることによって
0か1しかinsertもしくはupdateできないという情報を参考にしたため、このような設定になっております。

今回は、このfour_flg の値を表示させる際に問題が発生しております。

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

four_flg フィールドへの真偽値のINSERTや、SELECTクエリに WHERE four_flg=true/false の条件指定などはMapperファイルからも実行できて、
望む結果が取得できるのですが、 trueの値が格納されているはずのレコードを画面表示させると、全てfalseになってしまっています。

MySQL

1mysql> select id, hyojungo,kasugago, lank, four_flg+0 from mst_kasugago where four_flg=true; 2+----+--------------------+-----------------------+--------+------------+ 3| id | hyojungo | kasugago | lank | four_flg+0 | 4+----+--------------------+-----------------------+--------+------------+ 5| 3 | 大丈夫 | とんぱち | 中級 | 1 | 6| 4 | こんにちは | イピス | 初級 | 1 | 7| 6 | 今どこですか | どち男か男? | 中級 | 1 | 8| 10 | 大丈夫 | とんぱち | 初級 | 1 | 9| 13 | 猫 | にゃんころもち | 初級 | 1 | 10| 15 | フリップ | フィリップ | 初級 | 1 | 11| 18 | 子供 | お子 | 中級 | 1 | 12+----+--------------------+-----------------------+--------+------------+ 137 rows in set (0.00 sec)

Thymeleaf

1id 標準語 春日語 ランク 四択フラグ 23 大丈夫 とんぱち 中級 false 34 こんにちは イピス 初級 false 46 今どこですか どち男か男? 中級 false 510 大丈夫 とんぱち 初級 false 613 猫 にゃんころもち 初級 false 715 フリップ フィリップ 初級 false 818 子供 お子 中級 false 9

該当のソースコード

MapperファイルはMySQLクライアントで実行できたクエリをそのまま使用しております。

Mapper

1 2<mapper namespace="jp.co.sampleApi.mapper.MstKasugagoMapper"> 3 <select id="findAll" resultType="com.example.sampleApi.entity.kasugagoMember"> 4 select 5 id, 6 hyojungo, 7 kasugago, 8 lank, 9 four_flg+0 10 from 11 MST_KASUGAGO 12 where 13 four_flg=true 14 </select> 15

Entityクラスへの値の受け渡しにLombokを使用したいのですが、setter/getterを用意せずに実行してリクエストを送信したところ上手くいかず、
@Dataアノテーションを付与しているのにsetter/getterを用意しているおかしなソースになっています。

おそらく、このLombokの依存関係や記述に問題があるのではないかと考えています。

Entity

1package com.example.sampleApi.entity; 2 3import lombok.Data; 4 5@Data 6public class kasugagoMember { 7 8 private int id; 9 10 private String hyojungo; 11 12 private String kasugago; 13 14 private String lank; 15 16 private boolean four_flg; 17 18 public int getId() { 19 return id; 20 } 21 22 // 省略 23 24 public boolean isFour_flg() { 25 // ここでコンソール表示した段階でfalseになっている 26 System.out.println(four_flg); 27 return four_flg; 28 } 29 30 public void setFour_flg(boolean four_flg) { 31 this.four_flg = four_flg; 32 } 33} 34

pom

1 2 <parent> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-starter-parent</artifactId> 5 <version>2.3.0.RELEASE</version> 6 <relativePath/> <!-- lookup parent from repository --> 7 </parent> 8 <groupId>com.example.sampleApi</groupId> 9 <artifactId>SampleAPI</artifactId> 10 <version>0.0.1-SNAPSHOT</version> 11 <name>SampleAPI</name> 12 <description>Demo project for Spring Boot</description> 13 14 <properties> 15 <java.version>1.8</java.version> 16 </properties> 17 18 <dependencies> 19 <dependency> 20 <groupId>org.springframework.boot</groupId> 21 <artifactId>spring-boot-starter-thymeleaf</artifactId> 22 </dependency> 23 <dependency> 24 <groupId>org.springframework.boot</groupId> 25 <artifactId>spring-boot-starter-web</artifactId> 26 </dependency> 27 <dependency> 28 <groupId>org.mybatis.spring.boot</groupId> 29 <artifactId>mybatis-spring-boot-starter</artifactId> 30 <version>2.1.2</version> 31 </dependency> 32 <dependency> 33 <groupId>mysql</groupId> 34 <artifactId>mysql-connector-java</artifactId> 35 <version>8.0.14</version> 36 </dependency> 37 <dependency> 38 <groupId>org.springframework.boot</groupId> 39 <artifactId>spring-boot-devtools</artifactId> 40 <scope>runtime</scope> 41 <optional>true</optional> 42 </dependency> 43 <dependency> 44 <groupId>org.projectlombok</groupId> 45 <artifactId>lombok</artifactId> 46 <optional>true</optional> 47 </dependency> 48 <dependency> 49 <groupId>org.springframework.boot</groupId> 50 <artifactId>spring-boot-starter-test</artifactId> 51 <scope>test</scope> 52 <exclusions> 53 <exclusion> 54 <groupId>org.junit.vintage</groupId> 55 <artifactId>junit-vintage-engine</artifactId> 56 </exclusion> 57 </exclusions> 58 </dependency> 59 <dependency> 60 <groupId>org.mybatis</groupId> 61 <artifactId>mybatis</artifactId> 62 <version>3.4.2</version> 63 </dependency> 64 </dependencies> 65 66 <build> 67 <plugins> 68 <plugin> 69 <groupId>org.springframework.boot</groupId> 70 <artifactId>spring-boot-maven-plugin</artifactId> 71 </plugin> 72 </plugins> 73 </build> 74 75</project> 76 77

試したこと

SELECTクエリ実行時にbit型の値を整形するために four_flg+0にしてみましたが、何も変化はありませんでした。

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

依存関係ファイルのバージョンなどについては上記のpom.xmlの通りになります。

言葉足らずな部分もあると思いますが、何卒よろしくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/06/16 07:11

Lombokはエクリプスコンパイラを拡張するプラグインが必要だよ。 プレアデスも、エクリプスもstsも初期からはいってなかったきがする
ochosiken

2020/06/16 14:38

コメントありがとうございます。 コンパイラ拡張のプラグインに関しても調べてみましたが、上手く辿り着けませんでした・・・ mybatisのconfigファイルの設定に問題があり、修正したところ無事に結果を取得することができました!
guest

回答1

0

ベストアンサー

mapperでselectしたときの四択フラグの列名がfour_flg+0となっていて、Entity側の名称four_flgと一致しないのでちゃんとマッピングされていないのが原因と思われます。
さらに、双方で型も違うので、Entity側の型もintにしないとエラーになるのではないかと思われます。

select側の列名と型をEntityと揃えましょう。

追記

同じような環境を作って試してみました。
違いはfour_flgに+0していないところと、mybatis-config.xml中の<setting name="mapUnderscoreToCamelCase" />の内容です。

mybatis-config.xml

xml

1<?xml version="1.0" encoding="UTF-8" ?> 2<!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5<configuration> 6 <settings> 7 <setting name="mapUnderscoreToCamelCase" value="false"/> 8 </settings> 9</configuration>

mapper.xml(名前は適当です)

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.example.demo.HelloMapper"> 6 <select id="findAll" resultType="com.example.demo.HelloBean"> 7 select 8 id, 9 hyojungo, 10 kasugago, 11 lank, 12 four_flg 13 from 14 MST_KASUGAGO 15 </select> 16</mapper>

Entity Bean

java

1package com.example.demo; 2import lombok.Data; 3 4@Data 5public class HelloBean { 6 private int id; 7 private String hyojungo; 8 private String kasugago; 9 private String lank; 10 private boolean four_flg; //スネークケース 11 private boolean fourFlg; //キャメルケース 12}

<setting name="mapUnderscoreToCamelCase" value="false"/>にすると beanのfour_flg側がtrueに、<setting name="mapUnderscoreToCamelCase" value="true"/>にするとfourFlg側がtrueになります。
ちゃんとtrue/falseで値が取れるので+0してintにする必要はないと考えられます。

投稿2020/06/16 02:17

編集2020/06/16 09:52
hope_mucci

総合スコア4447

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

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

ochosiken

2020/06/16 04:53

回答ありがとうございます。 参考にさせていただきながら、Entity側と同じ列名である four_flgにmapperのselect文を修正しましたが、結果は変わりませんでした。 また、four_flg をEntity側でintにしてsetter/getterの引数や戻り値もint型に修正したところ、 org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'four_flg' cannot be found on object of type 'com.example.sampleApi.entity.kasugagoMember' - maybe not public or not valid? というExceptionが発生し、成功しませんでした。
hope_mucci

2020/06/16 05:27

うーん、型が合わないエラーメッセージなのか。それではresultMapで型を明示してやればどうでしょうか。 結果をMapで返すのなら難しく考える必要がないのですけどね・・・ あと、可能性は低いと思いますがキャメルケースとスネークケースを自動変換していて名前があわないとか。 setFor_flgをsetForFlgにしたら動く、とかあるかもしれません。
hope_mucci

2020/06/16 09:53

再現テストを行い回答に追記しました。 four_flg+0しなくても真偽値はちゃんと取れました。mapUnderscoreToCamelCaseで引っかかっているんじゃないかなと察します。
ochosiken

2020/06/16 14:36

回答の修正までしていただき、ありがとうございました。 ご教示いただいた通り、mybatis-config.xml内の"mapUnderscoreToCamelCase"の設定がtrueになっていたためfour_flgで上手く値が取れていませんでした。 mybatis-config.xmlの設定変更と、Entity側でのフィールドの修正とsetter/getterの修正のどちらでも望むような結果を得ることができました。ありがとうございます。 環境を作成して試してまでいただいて本当に感謝です。ベストアンサーにさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問