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

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

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

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

Spring Boot

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

Q&A

1回答

3217閲覧

[Spring Boot]単一エンティティによる複数テーブルの動的な切り替えの方法は?

_mino_

総合スコア1

Java

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

Spring Boot

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

0グッド

0クリップ

投稿2020/08/26 07:47

前提・実現したいこと

私はJavaおよびSpring Bootに関しては全くの素人で、いろんな資料を参考にしながら作業を進めています。

単一のエンティティを用いて、まったく同じ構成の複数テーブルを動的に切り替えて使用するにはどのようにすればよろしいでしょうか。

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

あるデーターベースに複数のテーブルがあり、いくつかのテーブルは保存しているデータと名前が違うだけでまったく同じ構成です。

これらをalpha_setおよびbravo_setとします。

alpha_setとbravo_setはid, name, uuidなどの属性をもち、それぞれがalpha_attribute, bravo_attributeなど別のテーブルと関連があります(これらのテーブルもまた同じ構成です)。

ER図

これらalpha_setおよびbravo_setテーブルへの問い合わせに関しても、やりたいことは同じなので、URLクエリパラメータによりテーブルの切り替えができないかと考えています。

同じWeb APIを用いて、URLクエリパラメータにより問い合わせ先を変更したいのですが、そのために単一エンティティによる複数テーブルの切り替えができないか、と考えました。

そこで単一の、たとえばXxxSetなどのエンティティを作成し、これに対してパラメータによって問い合わせ先のテーブルを切り替えられれば、と考えました。

たとえば、alpha_setbravo_setに対応するエンティティ(AlphaSetBravoSet)のスーパークラスやインターフェイスとすればよいかとも思ったのですが、どのように実装すればよいか分かりません。

該当のソースコード

実際のソースコードではないのですが、以下のコードで確認しています。

このコードはAlphaSetへの問い合わせを行なっています。

これをURLクエリパラメータによりBravoSetへの問い合わせに切り替えたいのです。

java

1// AlphaSet.java 2package com.example.multitableswitching; 3 4import java.util.Set; 5 6import javax.persistence.Entity; 7import javax.persistence.FetchType; 8import javax.persistence.GeneratedValue; 9import javax.persistence.GenerationType; 10import javax.persistence.Id; 11import javax.persistence.JoinColumn; 12import javax.persistence.JoinTable; 13import javax.persistence.OneToMany; 14import javax.persistence.Table; 15 16import lombok.AllArgsConstructor; 17import lombok.Data; 18import lombok.NoArgsConstructor; 19 20@Entity 21@Table(name = "alpha_set") 22@Data 23@NoArgsConstructor 24@AllArgsConstructor 25public class AlphaSet { 26 @Id 27 @GeneratedValue(strategy = GenerationType.IDENTITY) 28 private Integer id; 29 30 private String name; 31 32 private String uuid; 33 34 @OneToMany(fetch = FetchType.EAGER) 35 @JoinTable(name = "alpha_set_alpha_attribute", joinColumns = @JoinColumn(name = "set_id"), 36 inverseJoinColumns = @JoinColumn(name = "attribute_id")) 37 private Set<AlphaAttribute> attributes; 38}

java

1// AlphaAttribute.java 2package com.example.multitableswitching; 3 4import java.util.Set; 5 6import javax.persistence.Entity; 7import javax.persistence.FetchType; 8import javax.persistence.GeneratedValue; 9import javax.persistence.GenerationType; 10import javax.persistence.Id; 11import javax.persistence.JoinColumn; 12import javax.persistence.JoinTable; 13import javax.persistence.OneToMany; 14 15import lombok.AllArgsConstructor; 16import lombok.Data; 17import lombok.NoArgsConstructor; 18 19@Entity 20@Data 21@NoArgsConstructor 22@AllArgsConstructor 23public class AlphaAttribute { 24 @Id 25 @GeneratedValue(strategy = GenerationType.IDENTITY) 26 private Integer id; 27 28 private String name; 29 30 @OneToMany(fetch = FetchType.EAGER) 31 @JoinTable(name = "alpha_attribute_type", joinColumns = @JoinColumn(name = "attribute_id"), inverseJoinColumns = @JoinColumn(name = "type_id")) 32 private Set<Type> types; 33}

java

1// AlphaSetRepository.java 2package com.example.multitableswitching; 3 4import org.springframework.data.jpa.repository.JpaRepository; 5import org.springframework.stereotype.Repository; 6 7@Repository 8public interface AlphaSetRepository extends JpaRepository<AlphaSet, Integer> { 9}

java

1// Type.java 2package com.example.multitableswitching; 3 4import javax.persistence.Entity; 5import javax.persistence.GeneratedValue; 6import javax.persistence.GenerationType; 7import javax.persistence.Id; 8 9import lombok.AllArgsConstructor; 10import lombok.Data; 11import lombok.NoArgsConstructor; 12 13@Entity 14@Data 15@NoArgsConstructor 16@AllArgsConstructor 17public class Type { 18 @Id 19 @GeneratedValue(strategy = GenerationType.IDENTITY) 20 private Integer id; 21 22 private String name; 23}

java

1// MainController.java 2package com.example.multitableswitching; 3 4import org.springframework.beans.factory.annotation.Autowired; 5import org.springframework.data.domain.Page; 6import org.springframework.data.domain.Pageable; 7import org.springframework.data.domain.Sort.Direction; 8import org.springframework.data.web.PageableDefault; 9import org.springframework.web.bind.annotation.GetMapping; 10import org.springframework.web.bind.annotation.RequestMapping; 11import org.springframework.web.bind.annotation.RequestParam; 12import org.springframework.web.bind.annotation.RestController; 13 14@RestController 15@RequestMapping(path = "/multi-table") 16public class MainController { 17 @Autowired 18 AlphaSetRepository repo; 19 20 @GetMapping("/all") 21 public Page<AlphaSet> getAll(@RequestParam(value = "table", required = true) final String table, 22 @PageableDefault(page = 0, size = 10, direction = Direction.ASC, sort = { "id" }) final Pageable pageable) { 23 return repo.findAll(pageable); 24 } 25}

java

1// MultiTableSwittingApplication.java 2package com.example.multitableswitching; 3 4import org.springframework.boot.SpringApplication; 5import org.springframework.boot.autoconfigure.SpringBootApplication; 6 7@SpringBootApplication 8public class MultiTableSwittingApplication { 9 10 public static void main(String[] args) { 11 SpringApplication.run(MultiTableSwittingApplication.class, args); 12 } 13 14}

BravoSetおよびBravoAttributeは省略していますがAlphaSet, AlphaAttributeと内容的に同じ物です。

試したこと

上記の通り、スーパークラスを定義しようとしましたが、うまくいきませんでした。

また、データベースを動的に切り替える方法を解説した記事をいくつか参照したのですが、テーブルを切り替える内容を見つけることができませんでした。

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

  • Java
    11.0.8
  • Spring Boot
    2.3.3

お忙しいところ、貴重なお時間をいただき感謝いたします。

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

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

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

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

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

guest

回答1

0

URLクエリパラメータにより問い合わせ先を変更したい

コントローラーのメソッドを増やすのがいいかと思います。
GetMappingの指定は仮なので、適宜設定してください。

@RestController @RequestMapping(path = "/multi-table") public class MainController { @Autowired AlphaSetRepository alphaSetRepository; @Autowired BravoSetRepository bravoSetRepository; @GetMapping("/alphaSets") public Page<AlphaSet> getAlphaSet(@RequestParam(value = "table", required = true) final String table, @PageableDefault(page = 0, size = 10, direction = Direction.ASC, sort = { "id" }) final Pageable pageable) { return alphaSetRepository.findAll(pageable); } @GetMapping("/bravoSets") public Page<BravoSet> getBravoSet(@RequestParam(value = "table", required = true) final String table, @PageableDefault(page = 0, size = 10, direction = Direction.ASC, sort = { "id" }) final Pageable pageable) { return bravoSetRepository.findAll(pageable); } }

投稿2020/08/26 09:14

編集2020/08/26 09:30
ihigaku

総合スコア71

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

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

ihigaku

2020/08/26 09:52

質問文見落としてました、単一のAPIとありましたね・・ 自分には何ともです。
_mino_

2020/08/27 00:08

ご回答ありがとうございます。 返信が遅くなってしまい申し訳ございません。 なるべく単一APIによる切り替えを希望しているのですが、代替手段として検討したいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問