2017-12-29 21 views
0

Ich versuche eine Hibernate Abfrage zu schreiben, um eine Entität für eine bestimmte ID abzurufen. Diese Einheit hat eine Sammlung von einem anderen Unternehmen, aber ich möchte nur nicht gelöschten Entitäten abzurufen, die Sammlung zu füllen:Warum wird dieser Link beitreten Abruf nicht einen Eintrag abrufen?

Top-Level-Einheit:

@Entity 
@Table(name="rss_feed_definition") 
public class RSSFeedDefinition extends BaseEntity { 

    [...] 

    @OneToMany(mappedBy="rssFeedDefinitionId") 
    private Collection<RSSFeedProperty> rssFeedProperties; 

    [...] 

und die HQL:

em.createQuery("from RSSFeedDefinition definition left join fetch definition.rssFeedProperties property where property.deleted = false and definition.id = :id"); 

Warum gibt es die RSSFeedDefinition nicht zurück, obwohl ich mich der Eigenschaft anschließe (die ein gelöschtes Flag von true hat)?

+0

Weil Ihre 'where' -Klausel auf die verbundene Tabelle filtert. Sie müssen diese Bedingung in die linke Verknüpfung aufnehmen. –

+0

Entschuldigung, ich kann den Fehler nicht richtig sehen, könnten Sie ein Beispiel geben? – crm

Antwort

0

Ich bin kein Experte Hibernate sondern in reinem SQL Ihr Problem ist folgendes:

select * 
from RSSFeedDefinition definition 
left join property on definition.someField = property.otherField 
where property.deleted = false <--- this is the problem because it filters all data 
and definition.id = :id 

es so sein sollte:

select * 
from RSSFeedDefinition definition 
left join property on definition.someField = property.otherField 
        and property.deleted = false 
where definition.id = :id 

nur zu filtern, wenn die vorgenommen werden könnten, join.

+0

Von dem, was ich bisher gesammelt habe, scheint JPA das Filtern von Abrufen nicht zu unterstützen. Wenn ich mich nicht irre, wäre die einzige Alternative 2 Abfragen. Der erste, der die Entität der obersten Ebene abruft, und der zweite, um die Sammlung abzurufen. – crm

0

JPA unterstützt keine Bedingungen in einer JOIN FETCH-Anweisung. Aber in Ihrem Fall, können Sie die folgende Abhilfe verwenden:

TypedQuery<RSSFeedDefinition> q = em.createQuery("SELECT definition FROM RSSFeedDefinition definition LEFT JOIN FETCH definition.rssFeedProperties property WHERE property.deleted = false or property.deleted = IS NULL and definition.id = :id", RSSFeedDefinition.class); 

Wenn es keine Eigenschaft der Definition zugeordnet ist, seine Attribute sind null. Sie müssen also prüfen, ob deletedfalse oder null ist.

Verwandte Themen