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

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回答

605閲覧

リポジトリーで子Entityに親Entityのデータを格納したい Spring+Mybatis

massan728

総合スコア35

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クリップ

投稿2022/07/24 20:55

前提

一対多のテーブルで子Entityに親Entityのデータを格納したいのですが、
方法がわからず手こずっています。
SQL文でのテーブル結合ができていることは確認済みです。

実現したいこと

リポジトリーで子Entityに親Entityのデータを格納する。

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

Mapper

@Select("SELECT inventorys.id, products_id, quantity, report_date, created_at, updated_at, name " + "FROM inventorys " + "INNER JOIN products ON inventorys.products_id = products.id " + "WHERE report_date = #{sqlDate}") List<Inventory> findByDate(Date sqlDate); ←子クラスのInventory productNameがNullになる

該当のソースコード

子クラス

@Data public class Inventory { private int id; private int productsId; private Product productName; private float quantity; private Date reportDate; private LocalDateTime createdAt; private LocalDateTime updatedAt; }

親クラス

@Data public class Product { private int id; private String name; private List<Inventory> inventorys; }

schema.sql

DROP TABLE IF EXISTS inventorys; CREATE TABLE IF NOT EXISTS inventorys( id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, products_id INT NOT NULL, quantity FLOAT NOT NULL, report_date DATE NOT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); DROP TABLE IF EXISTS products; CREATE TABLE IF NOT EXISTS products( id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, name VARCHAR(100) NOT NULL );

Controller

@PostMapping("/id_search") public String search( @Validated @ModelAttribute InventorySearchReq inventorySearchReq, Model model ) { java.sql.Date sqlDate = java.sql.Date.valueOf(inventorySearchReq.getReportDate()); List<Inventory> list = inventoryService.findByDate(sqlDate); model.addAttribute("list", list); model.addAttribute("title", "在庫一覧"); return "inventory/index";

試したこと

調べてみたのですが、テーブル結合に関する情報ばかりで、
どのようにデータ挿入または参照しているのかがわかりませんでした。

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

java11, spring boot 2.7.0, MySQL, Mybatis

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

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

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

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

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

guest

回答1

0

ベストアンサー

@Selectアノテーションでは簡素なSQLしか対応出来ず
今回の様な複雑な要求を満たす場合、xmlファイルを作成して
SQL及びresultMapを定義する必要があります。

MyBatis 高度な結果マッピング
https://mybatis.org/mybatis-3/ja/sqlmap-xml.html#%E9%AB%98%E5%BA%A6%E3%81%AA%E7%B5%90%E6%9E%9C%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0

associationを使用するとresultMapを定義することができます。

投稿2022/07/25 00:32

Luice

総合スコア771

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

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

massan728

2022/07/27 19:38

情報をもとに作成したところ、無事情報を格納することができました。 大変助かりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問