結合でデータを取ろうとしているのですが、以下のような例外が起こります
この例外を回避する方法を知りたいです。
<例外が状況>
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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア7
0
ベストアンサー
提示したエラー内容から考えられるのは、
エンティティに記述したテーブルの関連と実データの差です。
1対1以上の関係
例:
あるクラス(T_estimate)には生徒(T_estimate_details)が
少なくとも1名以上である必要がある。
上記のような関係である場合、データによってエラーになりえると思います。
T_estimateの定義を提示するか確認してください。
投稿2015/12/03 01:19
総合スコア801
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/12/21 02:47
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。