PersonクラスとContractクラスのSpring Data RESTを実装しています。SpringデータREST:NULL値の問題
これは私のPerson.classです:
@Entity
@Table
public class Person {
@Column
private String name;
@Column
private String surname;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<Contract> contracts;
}
これは私のContract.classです:
@Entity
@Table
public class Contract {
@Column
private String contractType;
@Column
private String contractDesc;
}
は、これらは私のテーブル定義とデータです(スクリプトの自動生成埋め込み型HSQLデータベースで):
CREATE MEMORY TABLE PUBLIC.PERSON(ID, NAME, SURNAME, CONTRACT_ID);
CREATE MEMORY TABLE PUBLIC.CONTRACT(ID, CONTRACTTYPE, CONTRACTDESC);
ALTER TABLE PUBLIC.PERSON ADD CONSTRAINT FK_ABCDEFGHIJKLMNOPQRSTUVWXY FOREIGN KEY(CONTRACT_ID) REFERENCES PUBLIC.CONTRACT(ID);
INSERT INTO PERSON VALUES('abcdefghijklmnopqrstuv', 'Jack', 'Reds','1234567890abcdefghijklmnopqrstuv');
INSERT INTO CONTRACT VALUES('1234567890abcdefghijklmnopqrstuv', 'OTHER', 'Other');
これは私のURLで、春データRESTからを得た応答である:
List<Person> persons = personRepository.findAll(new PersonSpec("TEST"));
: localhostの/私のアプリ/ API /人/ {
"_embedded" : {
"persons" : [ {
"name" : "Jack",
"surname" : "Reds",
"contract" : {
"contractType" : "OTHER",
"contractDesc" : "Other",
...
しかし、私は、コードのこの部分を実行した場合変数 "人" デバッグ中
は、このデータに付加価値化するさ:
persons= ArrayList<E> (id=233)
elementData=Object[7] (id=235)
[0]= Person (id=236)
name= "Jack" (id=176)
surname= "Reds" (id=180)
contract= Contract_$$_jvst951_d (id=240)
contractType= null
contractDesc= null
[1]= Person (id=237)
[2]= Person (id=238)
modCount=1
size = 3
"contractType"と "contractDesc"はNULLに設定されています。
public class PersonSpec implements Specification<Person> {
@Override
public Predicate toPredicate(Root<Person> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
if (StringUtils.isNotBlank(searchParam.getContract())) {
predicates.add(cb.and(cb.and(cb.isNotNull(root.get("contract")),
cb.isNotNull(root.get("contract").get("contractType"))),
cb.equal(root.get("contract").get("contractType"), searchParam.getContract())));
}
何が問題になっています: はさらに、私のPersonSpecは、これらのフィールドを持つ任意のフィルタリングをしないように見えますか?なぜ私の人と私の契約の間にリンクがないのか分かりません。
ありがとうございました。
が含まれていることを確認してください。データモデルによれば、 'Person'は' PERSON'テーブルに 'CONTRACT_ID'という列があるので' Contract'を1つ持っていますが、マッピングに従ってPersonは 'List'を持っています。 –
@OneToOne(fetch = FetchType.LAZY、cascade = CascadeType.ALL) 私的契約契約に変換されました。しかし私はまだ問題があります。 –
また、述語を次のように置き換えてみてください: 'predicates.add(cb.equal(root.join(" contract ")。get(" contractType ")、searchParam.getContract()))' –