メインコンテンツまでスキップ
Version: v2.3.0

マッピングアノテーション


@FhirResourcePart

@FhirResourcePart(resourceType="Patient", converter=PatientPropertyConverter.class)
public class PatientResourceResource extends ResourceResource<Patient> {

ResourceResourceインターフェイスの実装クラスに付与するアノテーションです。
マッピング先のFHIRリソースクラスの単純名と、値の変換に使用するコンバータクラスを指定します。

引数

  • resourceType(省略不可)
    • マッピング先のFHIRリソースクラスの単純名を指定します。
  • converter(省略不可)
    • 値の変換に使用するコンバータクラスを指定します。

@FhirComposition

@FhirComposition
private PatientEntity patientEntity;

@FhirComposition(target="contact", tag = "Patient")
public List<PersonEntity> personEntities;

ResourceResourceインターフェイスの実装クラスが保持している、DBエンティティのフィールドに付与するアノテーションです。
指定したフィールドが、DBエンティティであることを示します。

@FhirCompositionはネストが可能です。
@FhirCompositionが付与されたフィールドのクラス内で、さらに他のクラスを@FhirCompositionで参照可能です。

引数

  • target
    • この引数を省略した場合は、対象のDBエンティティが、FHIRリソースそのものの値を保持していることを示します。その場合、指定したフィールドはListであってはなりません。
    • この引数を指定した場合は、対象のDBエンティティが、指定した値を名前とするFHIRリソースプロパティの値を保持していることを示します。
  • choice
    • マッピング先のFHIRリソースプロパティがChoice型の場合に、代入する型の単純名を指定します。
  • targetTag
    • 対象のDBエンティティが、複数のFHIRリソースのマッピングに使用される場合に指定します。
    • 対象のDBエンティティに含まれるマッピングアノテーションの内、この値と一致するtagが指定されている、またはtagが指定されていないアノテーションのみが有効になります。
  • tag
    • 対象のDBエンティティが、複数のFHIRリソースのマッピングに使用される場合に指定します。
    • この値が@FhirCompositiontargetTagの指定と一致する場合のみ、本アノテーションが有効になります。
    • 配列で複数のtagを指定可能です。
// 配列で複数のtagを指定可能
tag = {"tag1", "tag2"}
// tagがひとつだけの場合は中括弧を省略可能
tag = "tag1"

継承関係を持ったDBエンティティクラスに対するアノテーション

例えばChildEntity extends ParentEntityのような場合、ChildEntityParentEntityの両方のフィールドにアノテーションを付与します。 さらにResourceResourceインターフェイスの実装クラスに、以下のようにアノテーションを付与します。

@FhirComposition
private ParentEntity parentEntity;

@FhirComposition
private ChildEntity childEntity;

@Override
public void preProcess(Xxx dst, PropertyConverter conv) {
this.parentEntity = (ParentEntity) childEntity;
// ChildEntityのsetterなどで設定してもよい
}

DBの複数のテーブルとResourceResourceインターフェイスのマッピング

「方法1 - 一つのDBエンティティに複数テーブルの情報を持たせる」

DAO内のSQLクエリで複数のテーブルを結合した結果を取得して、それらの値を一つのDBエンティティにセットします。
一回のSQLクエリで必要な値を全て取得するのが難しい場合は、SQLクエリを複数回に分けていただいても構いません。

「方法2 - 複数のDBエンティティに対して@FhirCompositionアノテーションを付与する」

ResourceResourceインターフェイスの実装クラスのフィールドに複数のDBエンティティを持たせて、それぞれに@FhirCompositionアノテーションを付与します。

@RequiredArgsConstructor
@FhirResourcePart(resourceType = "Observation", converter = ObservationPropertyConverter.class)
public class ObservationResourceResource extends ResourceResource<Observation> {

// 中略

@FhirComposition
@Getter
@Setter
private ObservationEntity observationEntity;

@FhirComposition
@Getter
@Setter
private SpecimenEntity specimenEntity;
}

DBエンティティは入れ子にすることも可能です。

@RequiredArgsConstructor
@FhirResourcePart(resourceType = "Observation", converter = ObservationPropertyConverter.class)
public class ObservationResourceResource extends ResourceResource<Observation> {

// 中略

@FhirComposition
@Getter
@Setter
private ObservationEntity observationEntity;
}
public class ObservationEntity {

// 中略

// 入れ子にしたDBエンティティにさらに@FhirCompositionを付与する
@FhirComposition
private SpecimenEntity specimenEntity;
}

@FhirMap

@FhirMap(target="birthDate")
private LocalDateTime birthday;

@FhirMap(target = "subject", converter = "subject")
private String patientId;

主にDBエンティティの、getterを持つprivateフィールドに付与するアノテーションです。
フィールド値のマッピング方法を指定します。
getterを持つprivateフィールド以外に、以下に対しても付与可能です。

  • getterを持たないpublicなフィールド
  • public staticなフィールド(定数など)
  • 引数を持たないメソッド(getterなど)

引数

  • target(省略不可)
    • マッピング先のFHIRリソースのプロパティ名を指定します。
  • converter
    • マッピング時に使用する変換メソッド名を指定します。
    • 省略した場合は「simple<変換先の型の単純名>」が変換メソッド名となります。
      (例えば、変換先の型がDate型の場合は「"simpleDate"」が変換メソッド名となります)
    • 単純名が同じ変換先が同時に存在する(例: java.util.Datejava.sql.Date等)場合は、いずれかの変換メソッドを異なる名前で定義して、converter引数で変換メソッド名を指定してください。
@FhirMap(target = "name", converter = "nameList", param = "given", pg = "patientName")
private String firstName;

@FhirMap(target = "name", converter = "nameList", param = "family", pg = "patientName")
private String lastName;
  • param
    • 複数の引数を持つ変換メソッドの引数名を指定します。
  • pg
    • paramをグループ化します(pgはParameter Groupの略)。
    • 複数の引数を持つ変換メソッドが、複数回使用される場合に指定します。
    • 同じpg値が指定されたparamごとに、変換メソッドの呼び出しが生成されます。
    • デフォルト値は「""」です。
    • 値に「"."」(ピリオド)を指定した場合は、「"<フィールド名>"」が指定されたものとして扱われます。 これは全てのparamがひとつのフィールドで完結する場合(後述のconstantを併用して複数のparamを指定する場合など)に有用です。
@FhirMap(target = "code", converter = "code", param = "code", pg = ".")
@FhirMap(target = "code", converter = "code", param = "system", constant = "xxx", pg = ".")
@FhirMap(target = "code", converter = "code", param = "display", constant = "#\"\"", pg = "."))
private String typeCode;
  • constant
    • 変換メソッドへ渡す定数値を指定します。
    • 指定された定数値は、変換先が文字列型の場合には文字列、列挙値の場合には列挙値、それ以外の場合にはプログラムコードそのものとして扱われます。
    • ただし、文字列が「#」から始まっている場合には、2文字目以降がプログラムコードそのものとして扱われます。
      例えば、空の文字列を設定したい場合は「"#\"\""」を指定します。
      constant=""constant引数自体を指定しないことを意味するため)
@FhirMap(target = "effective", choice = "period", converter = "period", param = "start")
private LocalDateTime startDateTime;

@FhirMap(target = "effective", choice = "period", converter = "period", param = "end")
private LocalDateTime endDateTime;
  • choice
    • マッピング先のFHIRリソースプロパティがChoice型の場合に、代入する型の単純名を指定します。
  • skipNull
    • falseを指定すると、フィールド値がnullであっても変換メソッドを実行します。
    • デフォルト値はtrueです。
    • フィールド値の型がint等のプリミティブ型の場合は、必ずfalseを指定してください。
  • defineNull
    • フィールド値がnullの場合に設定する値を指定します。
    • 指定された値は、変換先が文字列型の場合は文字列、列挙型の場合には列挙値、それ以外の場合にはプログラムコードそのものとして扱われます。
    • skipNull=trueが指定されている場合は、defineNullの指定は無視されます。
@FhirMap(target = "gender", define = {
"F:FEMALE",
"M:MALE",
"O:OTHER"
}, defineDefault = "UNKNOWN", defineNull = "UNKNOWN")
private String gender;
  • define
    • 単純な変換規則をアノテーション上で指定する場合に使用します。
    • 変換規則は「<変換元>:<変換先>」形式の配列として指定します。
    • <変換元>は、変換元の型が文字列型の場合は文字列、それ以外の場合にはプログラムコードそのものとして扱われます。
    • <変換先>は、変換先が文字列型の場合は文字列、列挙値の場合には列挙値、それ以外の場合にはプログラムコードそのものとして扱われます。
  • defineDefault
    • defineで変換規則を指定した場合に、変換元のどれとも一致しなかった場合の値(javaのswitch文のdefaultに相当)を指定します。
    • 指定された値は、変換先が文字列型の場合には文字列、列挙値の場合には列挙値、それ以外の場合にはプログラムコードそのものとして扱われます。
@FhirMap(target = "xxxStatus", converter = "status", tag = "Patient")
@FhirMap(target = "yyyStatus", converter = "status", tag = "Observation")
private String status;
  • tag
    • DBエンティティが、複数のFHIRリソースのマッピングに使用される場合に指定します。
    • この値が@FhirCompositiontargetTagの指定と一致する場合のみ、本アノテーション(@FhirMap)が有効になります。
    • tagを省略した場合は、 @FhirCompositiontargetTagの指定に関わらず、本アノテーション(@FhirMap)が有効になります。
    • 配列で複数のtagを指定可能です。