マッピングアノテーション
@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リソースプロパティの値を保持していることを示します。
- この引数を省略した場合は、対象のDBエンティティが、FHIRリソースそのものの値を保持していることを示します。その場合、指定したフィールドは
- choice
- マッピング先のFHIRリソースプロパティがChoice型の場合に、代入する型の単純名を指定します。
- targetTag
- 対象のDBエンティティが、複数のFHIRリソースのマッピングに使用される場合に指定します。
- 対象のDBエンティティに含まれるマッピングアノテーションの内、この値と一致する
tag
が指定されている、またはtag
が指定されていないアノテーションのみが有効になります。
- tag
- 対象のDBエンティティが、複数のFHIRリソースのマッピングに使用される場合に指定します。
- この値が
@FhirComposition
のtargetTag
の指定と一致する場合のみ、本アノテーションが有効になります。 - 配列で複数の
tag
を指定可能です。
// 配列で複数のtagを指定可能
tag = {"tag1", "tag2"}
// tagがひとつだけの場合は中括弧を省略可能
tag = "tag1"
継承関係を持ったDBエンティティクラスに対するアノテーション
例えばChildEntity extends ParentEntity
のような場合、ChildEntity
とParentEntity
の両方のフィールドにアノテーションを付与します。
さらに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.Date
とjava.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リソースのマッピングに使用される場合に指定します。
- この値が
@FhirComposition
のtargetTag
の指定と一致する場合のみ、本アノテーション(@FhirMap
)が有効になります。 tag
を省略した場合は、@FhirComposition
のtargetTag
の指定に関わらず、本アノテーション(@FhirMap
)が有効になります。- 配列で複数の
tag
を指定可能です。