11

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 アノテーションを使用して推移的結合をモデル化するにはどうすればよいですか?

4

2 に答える 2

2

データではなく、クエリをモデル化しようとしているようです。データを正しくモデル化してから、クエリを作成する必要があります。

あなたは持っているようです

イベント

  • 処理する
  • ManyToOne(processId)

プロセス

  • イベント-OneToMany
  • 操作-OneToMany

手術

  • プロセス-ManyToOne(シーケンス)(シーケンスはIDではないため、これは少し奇妙です。これはJPA仕様の範囲外ですが、一部のJPAプロバイダーがサポートしている場合があります)

イベントのすべての操作を照会するには、次を使用できます。

Select o from Operation o join o.process p join p.events e where e.datetime = o.datetime

すべてのオブジェクトを元に戻すには、

Select o, p, e from Operation o join o.process p join p.events e where e.datetime = o.datetime

クエリをリレーションシップとしてモデル化する必要がある場合、これはJPA仕様の範囲外ですが、一部のJPAプロバイダーはそれをサポートしている場合があります。EclipseLinkでは、DescriptorCustomizerを使用して、任意の式基準を使用するように任意の関係を構成するか、SQLを所有することができます。

于 2012-10-03T13:05:30.913 に答える
1

あなたの疑似マッピングはほぼ正しい解決策です.2つ@JoinColumnのをグループ化するだけです@JoinColumns

@OneToOne
@JoinColumns({
  @JoinColumn(
    name = "datetime", referencedColumnName="datetime",
    insertable=false, updatable=false),
  @JoinColumn(
    name = "sequence", referencedColumnName="sequence",
    insertable=false, updatable=false)
})
private Operation operations;
于 2016-02-09T18:17:36.803 に答える