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

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

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

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

SQL

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

Spring

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

Spring Boot

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

Q&A

解決済

1回答

3381閲覧

Spring Boot @ManyToManyの関連設定のやり方

box_908

総合スコア5

Java

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

SQL

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

Spring

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

Spring Boot

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

0グッド

0クリップ

投稿2020/06/19 14:08

編集2020/06/20 02:04

前提・実現したいこと

2つのEntityを「@ManyToMany」の関連を持たせたい。

それぞれ、「type」というフィールドを持つ。
この「type」を関連付けさせたいです。

コンソールの結果を見るに、
「on sansho0_.btn_id=kmks1_.sanshos_btn_id 」が余計です。

#####「sansho0_.type=kmks1_.sanshos_type」だけでJOINしたいのです。

正しい記載方法をご教示お願い致します。

##コンソール内容
select
distinct sansho0_.btn_id as btn_id1_2_,
sansho0_.type as type2_2_
from
sansho sansho0_
inner join
kmk kmks1_
on sansho0_.btn_id=kmks1_.sanshos_btn_id
and sansho0_.type=kmks1_.sanshos_type

Entityクラス

・Sansho.java
・Kmk.java

該当のソースコード

java

1 2@Entity 3public class Sansho implements Serializable { 4 5 6 //複合主キー 7 @EmbeddedId 8 SanshoComposite sanshoComposite; 9 10 public Sansho(String btn_id, String type) { 11 sanshoComposite = new SanshoComposite(); 12 sanshoComposite.setBtn_id(btn_id); 13 sanshoComposite.setType(type); 14 } 15 16 public Sansho() {} 17 18 19 @ManyToMany(mappedBy = "sanshos") 20 private List<Kmk> kmks; 21 22getter,settr省略

java

1@Entity 2public class Kmk implements Serializable { 3 4 //複合主キー 5 @EmbeddedId 6 KmkComposite kmkComposite; 7 8 private String type; 9 10 11 public Kmk(String sbt,String kmk, String type) { 12 kmkComposite = new KmkComposite(); 13 kmkComposite.setSbt(sbt); 14 kmkComposite.setKmk(kmk); 15 this.type= type; 16 } 17 18 public Kmk() {} 19 20 @ManyToMany 21 @JoinColumn(name = "type", insertable = false, updatable = false) 22 private List<Sansho> sanshos; 23 24getter,settr省略

##複合主キークラス

java

1@Embeddable 2public class SanshoComposite implements Serializable { 3 4 //部店コード 5 private String btn_id; 6 //種類 7 private String type; 8 9 public SanshoComposite(String btn_id, String type) { 10 this.btn_id = btn_id; 11 this.type= type; 12 } 13 14 public SanshoComposite() {} 15

java

1@Embeddable 2public class KmkComposite implements Serializable { 3 4 //種別 5 private String sbt; 6 //科目 7 private String kmk; 8 9 public KmkComposite(String sbt, String kmk) { 10 this.sbt = sbt; 11 this.kmk = kmk; 12 } 13 14 public KmkComposite() {} 15

#Repositoryクラス

java

1@Repository 2public interface SanshoRepository extends JpaRepository<Sansho, String> { 3 4 @Query("SELECT DISTINCT s FROM Sansho s INNER JOIN s.kmks ") 5 List<Sansho> findGet(); 6} 7

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

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

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

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

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

guest

回答1

0

ベストアンサー

Spring Boot, Java をあまり知らないので、
SQLとフレームワークのリレーションについての一般的な話で進めます。
また当該フレームワークを知らないのでコードも書きません。

ざっくり回答

そういうものです。
フレームワークの機能を使用した場合、フレームワークが想定する形で動作します。

余計な結合条件を付与したくなければ、
Spring Bootでちょっと検索しただけですが)
@JoinTable だけ使用すればいいと思います。

詳細回答

サンプルデータはteratailの質問です。
使用してるサイトなのでイメージしやすそうかなって。

1:多 のサンプル

questions(質問)

idname
1Spring Boot @ManyToMany

answers(回答)

idquestion_idname
11質問内容
21質問内容

多:多 のサンプル

questions(質問)

idname
1Spring Boot @ManyToManyの使い方
2Spring Boot @JoinTableの使い方

tags(タグ)

idname
1Spring
2SQL

question_tags

idquestion_idtag_id
111
212
321
422

question_tags は中間テーブルと呼ばれるもので、
questions(質問)とtags(タグ)2つのテーブルを紐付ける役割をします。

フレームワークの機能について

フレームワークの[1:多]の機能を使用するとほぼ自動的に
on questions.id = answers.question_id の条件が付与されます。

フレームワークの[多:多]の機能を使用するとほぼ自動的に

SQL

1questions.id = answers.question_id

の条件が付与されます。

フレームワークがそういう形のデータを使用する想定で提供している機能なので、
それ以外の結合条件を使用する場合は自作する必要があります。
(@ManyToManyなどを使用しても、主キーや外部キーのカラム名の指定も出来ます。おそらく。)

主キー、外部キー、テーブル名、などは基本的にフレームワークによる命名規則に則り動作します。
※ 機能としてフレームワークの命名規則以外の別の命名をすることも可能です。

で。

フレームワーク的には上記サンプルの[多:多]の構造を想定してるので、そういうSQLが出来上がります。

投稿2020/07/03 02:03

bracket_i

総合スコア193

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

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

box_908

2020/07/03 10:54

ご回答ありがとうございます。 フレームワークについて勉強します
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問