Bir Kişi sınıfı ve bir Sözleşme sınıfı için Spring Data REST ile bir uygulamam var. Bu benim Contract.class olduğunuYay Verisi REST: NULL değerleri issue
@Entity
@Table
public class Person {
@Column
private String name;
@Column
private String surname;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<Contract> contracts;
}
:
Bu
benim Person.class olduğunu@Entity
@Table
public class Contract {
@Column
private String contractType;
@Column
private String contractDesc;
}
Bunlar benim tablolar tanımları ve veri (komut otomatik olarak oluşturulduğunu Gömülü bir HSQL DataBase'de):
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');
Bu benim url'deki, Bahar Veri REST edilen yanıttır:
List<Person> persons = personRepository.findAll(new PersonSpec("TEST"));
: localhost/my-app/API/kişi/ {
"_embedded" : {
"persons" : [ {
"name" : "Jack",
"surname" : "Reds",
"contract" : {
"contractType" : "OTHER",
"contractDesc" : "Other",
...
Ama bu kod bölümünü yürütmek eğer değişken "kişiler" hata ayıklama içinde
bu verilerle yüceltilip edilir:
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" ve "contractDesc" NULL olarak ayarlandı.
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())));
}
Sorun nedir: Dahası, benim PersonSpec bu alanlarda herhangi bir filtreleme yapmazlar gibi görünüyor? Kişim ile Sözleşmem arasında neden bir bağlantı olmadığını anlamıyorum.
Teşekkürler.
sizin datamodel ve haritalama arasında bir tutarsızlık var içerdiğinden emin olun.Veri modeline göre, bir 'Kişinin' bir 'Sözleşmesi' vardır (çünkü tablo' PERSON'un bir CONTRACT_ID 'sütununa sahiptir) ancak eşleştirmeye göre bir 'Kişinin' bir 'Listesi' vardır. –
Dönüştürdüğüm: @OneToOne (fetch = FetchType.LAZY, kaskad = CascadeType.ALL) özel Sözleşme sözleşmesi; ama hala problemim var. –
ayrıca yüklemeyi şu şekilde değiştirmeyi deneyin: 'predicates.add (cb.equal (root.join (" contract ")) get (" contractType "), searchParam.getContract())) –