2016-04-27 9 views
0

Ein Java-Webprojekt, das Hibernate verwendet, fiel mir einfach in den Schoß. Der ursprüngliche Architekt ist gegangen und ich habe fast keine Erfahrung mit der JPA Criteria API. Bitte vergib mir meine Unwissenheit. Ich suche nach Hilfe beim Schreiben mehrerer Joins mit der JPA Criteria API.Benötigen Sie Hilfe beim Erlernen, wie Sie mit jpa an zwei separaten Entitäten teilnehmen können

Ich habe die folgenden Entitäten und Beziehungen. Ein ElectronicDevice enthält eine Reihe von Komponenten, die eine Reihe von Signalen enthalten.
Ich versuche, eine Abfrage zu schreiben, die alle Komponenten und die Signale eines bestimmten elektronischen Geräts zurückgibt.

Ich kann das ElectronicDevice mit der Komponente bekommen, aber ich kann die Signale nicht bekommen. Ich habe folgende Abfrage geschrieben.

EntityManager em = getEm(); 

String electronicDeviceId="Some UUID"; 

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery cq = cb.createQuery(Component_.class); 
Root<ElectronicDevice> i = cq.from(ElectronicDevice.class); 
SetJoin<ElectronicDevice, Component> join = i.join(ElectronicDevice_.components); 
cq.where(cb.equal(i.get(ElectronicDevice_.id), electronicDeviceId)); 
cq.multiselect(join); 
TypedQuery q = em.createQuery(cq); 
List<Component> resultList = q.getResultList(); 

Meine Entity Definitionen werden als

@Entity 
public class ElectronicDevice implements Serializable { 

    @Id 
    @Column(length = 36) 
    private String id; 

    @XmlElement 
    @OneToMany 
    private Set<Component> components = new HashSet<Component>(); 
} 

@Entity 
public class Component extends ParametricObject implements Serializable{ 

    @XmlElement 
    @OneToMany 
    private Set<Signal> signals = new HashSet<Signal>(); 

    public Set<Signal> getComponents() { 
     return signals; 
    } 
} 

@Entity 
public class Signal implements Serializable { 

    @Id 
    @Column(length = 36) 
    private String id; 
} 

public class ParametricObject { 

    @EmbeddedId 
    @XmlElement 
    private ParametricId id; 

    @XmlElement 
    private String name; 

    public ParametricId getId() { 
     return id; 
    } 

    public void setId(ParametricId id) { 
     this.id = id; 
    } 

} 
folgt
public class ParametricId { 

    @XmlElement 
    @ManyToOne 
    @XmlIDREF 
    private ElectronicDevice ed; 

    @XmlAttribute 
    @XmlID 
    @Column(length = 36) 
    private String internalId; 

    public ElectronicDevice getEd() { 
     return ed; 
    } 

    public void setEd(ElectronicDevice ed) { 
     this.ed = ed; 
    } 

    public String getInternalId() { 
     return internalId; 
    } 

    public void setInternalId(String internalId) { 
     this.internalId = internalId; 
    } 
} 

Antwort

-1

beziehen Sie sich auf die Diskussion bei "Hibernate Criteria Join with 3 Tables". Ihre Abfrage sollte so aussehen.

müssen Sie ElectronicDevice mit menyToOne Anmerkung in der Komponente hinzuzufügen. (Das Beispiel bei http://www.mkyong.com/hibernate/hibernate-one-to-many-relationship-example-annotation/ sehen.)

Criteria c = session.createCriteria(Component.class, "cmp"); 
c.createAlias("cmp.signals", "signal"); // this will do inner join 
c.add(Restrictions.eq("cmp.electronicDevice", "xxxx")); 
return c.list(); 
+0

Vielleicht ist Ihre Antwort, die ich bin nicht ganz verstehen. Dies scheint jedoch nicht die JPA-Kriterien-API zu verwenden. Ist dieser Code spezifisch für Hibernate? –

+0

ja dies ist spezifisch für überwintern –

Verwandte Themen