3 つのエンティティとしてモデル化された 3 つのテーブルがあります。
@Entity
@Table(name="event")
public class Event {
public Long datetime;
public String name;
public Long processId;
}
@Entity
@Table(name="process")
public class Process {
public Long Id;
public Long sequence;
public Name name;
}
@Entity
@Table(name="operation")
public class Operation {
public Long Id;
public Long datetime;
public Long sequence;
}
process-operation-sequence の一意の単一レコードは、3 方向の結合制約を持つ SQL によって取得されます。
SELECT *
FROM event e, process p, operation q
WHERE e.processId = p.id
AND e.datetime = q.datetime
AND p.sequence = q.sequence
JPA でそれを実装するには、操作のリストを作成する必要があります。これは、JQPL の等式 p.sequence = q.sequence によって単一のレコードに明示的に絞り込まれます。
@Entity
@Table(name="event")
public class Event {
public Long datetime;
public String name;
public Long processId;
@OneToOne
@JoinColumn(
name = "processId", referencedColumnName="id",
insertable=false, updatable=false)
private Process process;
@OneToMany
@JoinColumn(
name = "datetime", referencedColumnName="datetime",
insertable=false, updatable=false)
private List<Operation> operations;
}
JPQL が推移的な 3 番目の結合制約を指定する場所:
SELECT e FROM Event e
INNER JOIN FETCH e.process p
INNER JOIN FETCH e.operations q
WHERE p.sequence = q.sequence
ただし、3 つの制約すべてをエンティティ POJO 内でモデル化する必要があります。JPA アノテーションだけを使用して 3 方向結合する方法はありませんか? 次のエンティティ擬似コードが示すように:
@Entity
@Table(name="event")
public class Event {
public Long datetime;
public String name;
public Long processId;
@OneToOne
@JoinColumn(
name = "processId", referencedColumnName="id",
insertable=false, updatable=false)
private Process process;
@OneToOne
@JoinColumn(
name = "datetime", referencedColumnName="datetime",
insertable=false, updatable=false)
@JoinColumn(
name = "process.sequence", referencedColumnName="sequence",
insertable=false, updatable=false)
private Operation operations;
}
JPQLでtransitive-join制約を指定する必要がないように
SELECT e FROM Event e
INNER JOIN FETCH e.process p
INNER JOIN FETCH e.operations q
JPA アノテーションを使用して推移的結合をモデル化するにはどうすればよいですか?