2017-01-31 16 views
12

Başka varlık sahibi bir varlık var: Ben Sınıf A nesneleri aldığınızdaBaşka bir varlık tarafından sahip olunan bir JPA varlığının alt kümesini nasıl gönderirsiniz?

//psuedocode  
public class ClassA{ 
    private String name; 

    @OneToOne 
    private ClassB classb; 
} 

public class ClassB{ 
    private String thing1; 
    private String thing2; 
    private String thing3; 
} 

, ben ClassB.thing3 görmek istemiyoruz ama thing1 ve şeyi 2 görmek istiyorum:

{ 
"name":"classa", 
"classb":{ 
     "thing1":"hi", 
     "thing2":"there" 
     } 
} 
sonra seco üzerinde gözardı eder, çünkü

{"thing1":"hi", 
"thing2":"there", 
"thing3":"joseph"} 

Yani sadece bir thing3 üzerinde ek açıklama görmezden koyamazsınız: Ben ClassB sorgulamak eğer

Ama her şey görmek istiyorum nd getir. Ben Converter<ClassB> denedim, ancak bu JSON nesnesini Java tarafına dönüştürürken (dönüştürücü bir String bekler, ancak bunun yerine nesneyi alır) JSON için toString() ve fromString() uygulamak için beni zorlar.

Mümkünse json sağlayıcımın işi yapmasına izin vermek için mümkünse JSON nesnesini kendim/ayrıştırma yapmaktan kaçınmak istiyorum. Johnzon'dayım.

+1

Json sağlayıcınız nedir? Jackson, istediğini yapabilir, ancak standart olmayan Json görüşlerini destekler. Örn: http://www.baeldung.com/jackson-json-view-annotation – Gimby

cevap

1

Bu, size @NamedEntityGraph kullanmak gerekir mümkündür,

Bu yardımcı olmalıdır, http://www.thoughts-on-java.org/jpa-21-entity-graph-part-1-named-entity/

+0

Bunun bir cevap olarak kabul edilmesini sağlamak için, en azından OP'lerin durumu için uygulamayı açıklamalısınız, sadece bir genel öğreticiye değil . – Deltharis

+0

teşekkürler, yapacak! bir hurry oldu @Deltharis – zillani

+0

Emin değilim @ NamedEntityGraph's burada gitmek için yol çünkü [JPA 2.1] (http://download.oracle.com/otndocs/jcp/persistence-2_1-fr-eval-spec/index. html) Spec, sağlayıcının uygun gördüğü kadar veri almasını sağlar, dolayısıyla ClassB garantisi yoktur.thing3, yalnızca Grafik Grafikte olmadığı için yüklenmeyecektir: _The kalıcılık sağlayıcısının, getirme grafiği veya yük grafiğiyle belirtilenin ötesinde ek varlık durumunu almasına izin verilir. Ancak, kalıcılık sağlayıcısı getirme veya load graph._ – tom

1

Böyle bir şey SEÇ YENİ kullanarak sorgulayarak mümkün olmalıdır, ancak bazı yeni Sınıfları ihtiyacımız olacak Bunun için ... ve varlıklarınızı doğrudan JSON'a aktarmayacaksınız.

yeni Sınıflar: (yalancı kod)

class ResultB { 
    String thing1; 
    String thing2; 

    public ResultB(ClassB classB) { 
     this.thing1 = classB.thing1; 
     this.thing2 = classB.thing2; 
    } 
} 

class ResultA { 
    String name; 
    ResultB resultB; 

    public ResultA(ClassA classA) { 
     this.name=classA.name; 
     this.resultB=new ResultB(classA); 
    } 
} 

Sorgu:

select new ResultA(a) from ClassA a fetch join a.classB; 

Sonra JSON yerine ClassA arasında resulta geçebilir.

Not: Yukarıdaki açıklamada belirtildiği gibi, ben NamedEntityGraphs JSON sağlayıcı tarafından yapılması gereken Hep veritabanındaki tüm verileri almak istiyorsunuz burada

+0

Bu bir çözüm olabilir, ancak ResultA'yı Json sağlayıcımdan geçmek yerine, onu ekibimin ön ucuna aynı şekilde aynı şekilde ClassA ve ClassB'ye dönüştürmek isteyebilirim. Bu, gereksiz alanların getirilmesiyle ilgili kaynakları harcamaya gerek duyulmamasından kaynaklanmaktadır, ancak sadece şu andaki mevcut standartımıza aykırı olduğu için ekibimden geçmek zorunda kalacağım "özel veri erişim sınıflarına ihtiyaç duymak" ile birlikte gelir. Veri aktarımı ve erişim sınıfları olarak varlıklar. – GuitarStrum

+0

Hmm, evet, onu orijinal sınıflara dönüştürebilirsiniz, ancak bu sınıfların geri döndüklerinde (olduğu gibi) geri döndüklerinde dikkatli olmalısınız, çünkü (silme) alanlarını silebilirdiniz (veya varsa Özel Durumlar üretiyorsanız) alanlar null olamaz. – tom

1

gidip filtreleme izin yoludur sanmıyorum Yine de serileştirmek istiyorsan. Eğer Jackson kullanırsanız basitçe alanlara görüşlerini ekleyebilirsiniz:

public class ClassA { 

    @JsonView(Views.AlwaysInclude.class) 
    private String name; 

    @JsonView(Views.AlwaysInclude.class) 
    @OneToOne 
    private ClassB classb; 
} 

public class ClassB { 
    @JsonView(Views.AlwaysInclude.class) 
    private String thing1; 

    @JsonView(Views.AlwaysInclude.class) 
    private String thing2; 

    private String thing3; 
} 

public class Views { 
    public static class AlwaysInclude { 
    } 
} 

Daha sonra size sadece görünümünüzü kullanmak gerekir sizin nesne seri zaman: size daha sonra sadece ClassB seri hale getirmek istiyoruz

String result = mapper 
    .writerWithView(Views.AlwaysInclude.class) 
    .writeValueAsString(new ClassA()); 

Görüntülemeyi kullanmamalı.

String result = mapper.writeValueAsString(new ClassB()); 
+0

Jackson kullanmıyoruz ama teşekkür ederim. "Ben her zaman veritabanından tüm verileri almak ve JSON sağlayıcısı tarafından yapılan filtrelemeye izin vermek" yorum için, benzer bir rotaya gidebilir ve ClassA getirirken ClassB'den ihtiyacım olmayan alanları boşaltabilirim. Bu yaklaşımın dezavantajı, hala ihtiyaç duymadığım veriyi almak için kaynak harcıyor olduğum, ancak flipside, sağlayıcımın benim için doğru jsonu yapmasına izin verebileceğim. – GuitarStrum

İlgili konular