@ManyToOneの指定(解決)
うーん。むずかしい。そりゃ、EmployeeテーブルのキーIdに外部キーを張っているProjectテーブルがあったとして、そのProjectテーブルにある意味的に「リーダ」を表すカラムがemployee_idだったらいい。Projectエンティティクラスは、
public class Project { @Id @GeneratedValue public BigDecimal id; public BigDecimal employeeId; @ManyToOne public Employee employee; :
とすれば、自動的に多対1を実現してくれる。Joinしたときに、Project のメンバーにちゃんとemployeeオブジェクトが紐づいてくれている。でも、実際問題、カラム名は「リーダ」なんだから leader_id とかにしたいじゃないか。というかそう仮定する。
そのときってどう指定すればよいんだろう?
public class Project { @Id @GeneratedValue public BigDecimal id; public BigDecimal leaderId; @ManyToOne @JoinColumn(name="LEADER_ID", referencedColumnName="ID") public Employee leader; :
でもうまくいかない。こんなエラーがでる。
org.seasar.extension.jdbc.exception.PropertyNotFoundRuntimeException: [ESSR0701]エンティティ(Project)のプロパティ(employee)が見つかりません。
org.seasar.extension.jdbc.EntityMeta.getPropertyMeta(EntityMeta.java:175)
org.seasar.extension.jdbc.query.AutoSelectImpl.getPropertyMeta(AutoSelectImpl.java:698)
org.seasar.extension.jdbc.query.AutoSelectImpl.prepareJoin(AutoSelectImpl.java:556)
org.seasar.extension.jdbc.query.AutoSelectImpl.prepareJoins(AutoSelectImpl.java:539)
org.seasar.extension.jdbc.query.AutoSelectImpl.prepare(AutoSelectImpl.java:340)
org.seasar.extension.jdbc.query.AbstractSelect.getResultList(AbstractSelect.java:169)
public Employee leader;
を
public Employee employee;
にしたらうまくいくけどそういう問題じゃないよな。「リーダ」と「サブリーダ」がいたらどうすんねんって話やし。
アノテーションの属性もけっこうあるし、ややこしいなぁ。
追記
実際はStudySessionテーブルというのを使っていたのですが、このテーブルの背景を説明するのはアレなので便宜上Projectテーブルで説明していました。しかしStackTraceがStudySessionのほんまもんの方をはりつけてしまっていたため、混乱を招いてしまいました。
なので、Projectテーブルを実際につくって、実際に発生した例外を貼り付けなおしました。
追記2
Entityクラスをどうのこうのするのではなく、
select().innerJoin(”leader”).getResultList();
と、SQL生成側を変えることでうまくいきました。
id:koichikさん、ありがとうございました。