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

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

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

HibernateとはJava言語のobject-relational mapping (ORM)ライブラリであり、Object/Relational Mappingよりはるか多くの方法でアプリケーションをPOJOで機能付けることができます。

JOIN

これはSQL文のJOINに関するタグです。リレーショナルデータベースシステムの二つ以上のテーブルを結合する際に、この構文が利用されます。

Spring

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

Q&A

解決済

2回答

9865閲覧

【Spring】【JPA】左外部結合がうまくいきません

Daiyo_Miura

総合スコア7

Hibernate

HibernateとはJava言語のobject-relational mapping (ORM)ライブラリであり、Object/Relational Mappingよりはるか多くの方法でアプリケーションをPOJOで機能付けることができます。

JOIN

これはSQL文のJOINに関するタグです。リレーショナルデータベースシステムの二つ以上のテーブルを結合する際に、この構文が利用されます。

Spring

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

0グッド

0クリップ

投稿2015/11/29 04:29

結合でデータを取ろうとしているのですが、以下のような例外が起こります
この例外を回避する方法を知りたいです。

<例外が状況>
T_estimateにデータがある
T_estimate_detailsにデータがない

※両方データがある場合は例外は発生していません。

【実行しているJPQL】

sql

1select 2 new sel.T( 3 t_e.esti_rep_no 4 , t_ed.esti_rep_details_no) 5 from 6 T_estimate t_e left join t_e.t_estimate_details t_ed

【結果格納クラス】

java

1package sel; 2 3public class T { 4 private int esti_rep_no; 5 private int esti_rep_details_no; 6 7 // アクセサメソッドは省略 8}

【スタックトレース】

java

1java.lang.IllegalArgumentException: org.hibernate.QueryException: could not instantiate class [sel.T] from tuple

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

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

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

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

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

guest

回答2

0

自己解決しましたので、報告いたします。

【原因】
データ型を基本型で定義していた。
データがnullの場合に、基本型に代入できないという現象が発生した
※左外部結合で、子テーブルにデータがない場合、nullで取れる
※今回は、T_estimateが親、T_estimate_detailsが子です。

【対応】
基本型の個所をラッパークラスに変更する
※親、子テーブルとも対応する

【ソースコード】
<親テーブル>

java

1package account.system.common.entity; 2 3import java.util.Date; 4import java.sql.Timestamp; 5import java.util.List; 6 7import javax.persistence.CascadeType; 8import javax.persistence.Entity; 9import javax.persistence.GeneratedValue; 10import javax.persistence.GenerationType; 11import javax.persistence.Id; 12import javax.persistence.JoinColumn; 13import javax.persistence.ManyToOne; 14import javax.persistence.OneToMany; 15import javax.persistence.Temporal; 16import javax.persistence.TemporalType; 17 18@Entity 19public class T_estimate { 20 @OneToMany(cascade = CascadeType.ALL, mappedBy = "t_estimate") 21 private List<T_estimate_details> t_estimate_details; 22 23 /* 修正前のソースコード */ 24/* 25 @Id 26 @GeneratedValue(strategy = GenerationType.AUTO) 27 private int esti_rep_no; 28 @Temporal(value=TemporalType.DATE) 29 private Date esti_date; 30 private int inq_no; 31 private int ord_no; 32 private boolean comp_flag; 33 private String upd_username; 34 private Timestamp reg_datetime; 35 private Timestamp upd_datetime; 36*/ 37 38 /* 修正後のソースコード */ 39 @Id 40 @GeneratedValue(strategy = GenerationType.AUTO) 41 private Integer esti_rep_no; 42 @Temporal(value=TemporalType.DATE) 43 private Date esti_date; 44 private Integer inq_no; 45 private Integer ord_no; 46 private Boolean comp_flag; 47 private String upd_username; 48 private Timestamp reg_datetime; 49 private Timestamp upd_datetime; 50 51 // アクセサメソッドは省略 52 53}

<子テーブル>

java

1package account.system.common.entity; 2 3import java.sql.Timestamp; 4 5import javax.persistence.Entity; 6import javax.persistence.Id; 7import javax.persistence.IdClass; 8import javax.persistence.JoinColumn; 9import javax.persistence.ManyToOne; 10 11import account.system.common.entity.pk.Pk_T_estimate_details; 12 13/** 14 * 見積明細テーブル 15 */ 16@Entity 17@IdClass(Pk_T_estimate_details.class) 18public class T_estimate_details { 19 /* 連携 */ 20 @ManyToOne 21 @JoinColumn(name = "esti_rep_no", insertable = false, updatable = false) 22 private T_estimate t_estimate; 23 24 /* 修正前 */ 25/* 26 @Id 27 private int esti_rep_no; 28 @Id 29 private int esti_rep_details_no; 30 private String prod_no; 31 private int number; 32 private int discount; 33 private String upd_username; 34 private Timestamp reg_datetime; 35 private Timestamp upd_datetime; 36*/ 37 38 /* 修正後 */ 39 @Id 40 private Integer esti_rep_no; 41 @Id 42 private Integer esti_rep_details_no; 43 private String prod_no; 44 private Integer number; 45 private Integer discount; 46 private String upd_username; 47 private Timestamp reg_datetime; 48 private Timestamp upd_datetime; 49 50 // アクセサメソッドは省略 51 52}

<複合キー管理クラス(子クラス)>

java

1package account.system.common.entity.pk; 2 3import java.io.Serializable; 4 5/* 複合キークラス */ 6public class Pk_T_estimate_details implements Serializable { 7 private static final long serialVersionUID = 1L; 8 9 /* 修正前 */ 10/* 11 private int esti_rep_no; 12 private int esti_rep_details_no; 13*/ 14 15 /* 修正後 */ 16 private Integer esti_rep_no; 17 private Integer esti_rep_details_no; 18}

投稿2015/12/21 03:01

Daiyo_Miura

総合スコア7

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

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

0

ベストアンサー

提示したエラー内容から考えられるのは、
エンティティに記述したテーブルの関連と実データの差です。

1対1以上の関係
例:
あるクラス(T_estimate)には生徒(T_estimate_details)が
少なくとも1名以上である必要がある。

上記のような関係である場合、データによってエラーになりえると思います。

T_estimateの定義を提示するか確認してください。

投稿2015/12/03 01:19

liguofeng29

総合スコア801

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

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

liguofeng29

2015/12/03 01:22

他の質問で定義があったのですが、 @OneToMany(cascade = CascadeType.ALL, mappedBy = "t_estimate" ) なので、1対多の関係なので、 データの整合性が取れてないとフレームワークが判断したので、 開発者は適切なハンドリングを行う必要があります。
Daiyo_Miura

2015/12/21 02:47

> liguofeng29さん 自己解決いたしました。 レスが遅れ、申し訳ありません。 ソースコードも付け、自己解決コメントで記述します。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問