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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Spring Boot

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

Q&A

解決済

1回答

2076閲覧

SpringBootの@Repositoryにおけるクエリの実装

yutyut

総合スコア1

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Spring Boot

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

0グッド

0クリップ

投稿2021/05/19 01:59

編集2021/05/19 02:54

前提・実現したいこと

Spring Bootを用いてWeb家計簿アプリの作成を行なっています。
そこでデータベースの収入、支出テーブルからそれぞれレコードを読み込み一覧表示したいと思っています。 
以下2点を実装する事がしたい事です。
・DBから数値→文字列に変換して取得
・文字列+文字列の連結

【想定】
+-----------------+-------------+--------------+
| rec_date | amount | category |
+-----------------+-------------+--------------+
| 2021-04-11 | 1234 | 食費 |
| 2021-05-07 | 1111 | 雑費 |
+-----------------+-------------+--------------+

+-----------------+-------------+--------------+
| rec_date | amount | category |
+-----------------+-------------+--------------+
| 2021-05-11 | 111111 | 給料  |
| 2021-05-17 | 1000 | 雑収入 |
+-----------------+-------------+--------------+

 数値を文字列に変換しUNION ALL↓

+-----------------+-------------+--------------+
| rec_date | amount | category |
+-----------------+-------------+--------------+
| 2021-04-11 | -1234 | 食費 |
| 2021-05-07 | -1111 | 雑費 |
| 2021-05-11 | +111111 | 給料 |
| 2021-05-17 | +1000 | 雑収入 |
+-----------------+---------------+-----------+

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

下記のコードでプロジェクトを実行すると'-'のみが連結されて表示されます。 どうやらint→ncharの変換は行えているようですが、文字列の連結が出来ていないようです。 +---------------+----------+-----------+ | rec_date | amount | category | +---------------+----------+-----------+ | 2021-04-11   | -1234 | 食費 | | 2021-05-07   | -1111 | 雑費 | | 2021-05-11   | 111111 | 給料 | | 2021-05-17   | 1000 | 雑収入 | +---------------+----------+-----------+

該当のソースコード

Java

1package com.example.demo; 2 3import java.util.List; 4 5import org.springframework.data.jpa.repository.JpaRepository; 6import org.springframework.data.jpa.repository.Query; 7import org.springframework.stereotype.Repository; 8 9@Repository 10public interface MainRepository extends JpaRepository<MainMenu, Integer>{ 11 public static final String mainSql = 12 "SELECT\n" 13 + " CONCAT('-', CONVERT(amount, nchar)) as amount,\n" 14 + " category,\n" 15 + " rec_date,\n" 16 + " reg_no\n" 17 + "FROM\n" 18 + " t_spends\n" 19 + "WHERE\n" 20 + " del_flag = 0\n" 21 + "UNION ALL\n" 22 + "SELECT\n" 23 + " CONCAT('+', CONVERT(amount, nchar)) as amount,\n" 24 + " category,\n" 25 + " rec_date,\n" 26 + " reg_no\n" 27 + "FROM\n" 28 + " t_incomes\n" 29 + "WHERE\n" 30 + " del_flag = 0\n" 31 + "ORDER BY\n" 32 + " rec_date"; 33 34 @Query(value = mainSql, nativeQuery = true) 35 List<MainMenu> findAll(); 36} 37

Java

1package com.example.demo; 2 3import java.io.Serializable; 4import java.sql.Date; 5 6import javax.persistence.Column; 7import javax.persistence.Entity; 8import javax.persistence.Id; 9 10import lombok.Data; 11 12@Data 13@Entity 14public class MainMenu implements Serializable{ 15 @Id 16 @Column(name = "reg_no") 17 private int reg_no; 18 19 @Column(name = "rec_date") 20 private Date rec_date; 21 22 @Column(name = "amount") 23 private int amount; 24 25 @Column(name = "category") 26 private String category; 27 28 @Override 29 public String toString() { 30 return "MainMenu [reg_no=" + reg_no + ", rec_date=" + rec_date + ", amount=" + amount + ", category=" + category 31 + "]"; 32 } 33} 34

試したこと

mariaDBを使っているのですが文字列連結の方言が含まれておりそれが原因であると予想し、JPQLでクエリを実装しようと試みました。しかしint→ncharの変換、文字列変換の方法がわからずに断念しました。
そもそもJPQLでそれらの操作を行えるのかもあやふやになってしまってます。

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

mariaDB ver15.1
Eclipse 4.19.0

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

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

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

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

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

m.ts10806

2021/05/19 02:29

Repositoryから実行したときだけですか?DB直で実行したらどうなるのでしょう。 同じならJava関係なくSQLだけの問題です。
yutyut

2021/05/19 02:37

はい。Repositoryから実行した時のみこのような動きになりました。 DBからであれば想定通りの結果となります。
neko_the_shadow

2021/05/19 02:45

実行結果はMainMenuのamountプロパティに設定する想定だと思います。amountのクラスはStringでしょうか?
yutyut

2021/05/19 02:52

その想定通りです。amountはintである為、CONVERT関数を用いてint→Stringへ変換しています。
guest

回答1

0

ベストアンサー

SQL側では文字列型に変換できていますが、それをJava側に持ってくる際、数値型(int)のプロパティにマッピングしています。このプロパティをJava側で表示する際、intからStringへ暗黙のうちに変換されていると思います。Javaは正の値をStringに変換する際、+なしにするため、今回のような事象が発生していると考えられます。

対応方法としては、たとえば以下が考えられます。

  • Javaに持ってくる際にStringのプロパティにマッピングする
  • 数値型のまま持ってきて、表示する際(文字列型に変換する際)に、+つきにする。

投稿2021/05/19 03:51

neko_the_shadow

総合スコア2349

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

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

yutyut

2021/05/19 04:09

挙げていただいた対応方法の1つ目で解決する事が出来ました。 Java側に持ってくる際のマッピングについて理解不足でしたが、回答で説明して頂いた内容によって理解する事が出来ました。有難う御座います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問