2013-05-29 11 views
5

Ich arbeite an einem Projekt, das ich kürzlich übernommen habe und versuche, Querydsl zu verwenden.Querydsl @QueryInit funktioniert nicht

Ich habe einen Eintrag Klasse:

@Entity 
public class EListing { 

... 

    private static final long serialVersionUID = 7729681308228522567L; 

    @QueryInit("provider") 
    private EExternalId masterId; 

    @OneToOne(fetch = FetchType.EAGER, 
      orphanRemoval = true, 
      cascade = CascadeType.ALL) 
    @JoinColumn(name = "master_ext_id") 
    @NotNull(message = EvalMessageCode.LISTING_MASTERID_NOTNULL) 
    @Valid 
    public EExternalId getMasterId() { 

     return masterId; 
    } 

    public void setMasterId(final EExternalId masterId) { 

     this.masterId = masterId; 
    } 

... 

} 

und eine externe ID Klasse:

@Entity 
public class EExternalId implements Serializable { 

    public static final String FIELD_PROVIDER_PREFIX = "provder."; 

    private static final long serialVersionUID = -4577890108032056848L; 

    private String externalId; 

    private Long id; 

    private EDataProvider provider; 

    @Column(name = "external_id", 
      updatable = false) 
    @NotBlank(message = EvalMessageCode.EXTID_ID_NOTBLANK) 
    public String getExternalId() { 

     return externalId; 
    } 

    @Id 
    @GeneratedValue(generator = "external_id_seq") 
    @Column(name = "id") 
    public Long getId() { 

     return id; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "provider_id", 
       nullable = false, 
       updatable = false) 
    @IndexedEmbedded(prefix = FIELD_PROVIDER_PREFIX) 
    @NotNull(message = EvalMessageCode.EXTID_PROVIDER_NOTNULL) 
    public EDataProvider getProvider() { 

     return provider; 
    } 

    public void setExternalId(final String externalId) { 

     this.externalId = externalId; 
    } 

    public void setId(final Long id) { 

     this.id = id; 
    } 

    public void setProvider(final EDataProvider provider) { 

     this.provider = provider; 
    } 

} 

Ich habe eine ListingPredicates Klasse:

public class ListingPredicates { 

    public static BooleanExpression byMasterExternalIdAndProviderId(
     final String externalId, final Long providerId) { 

     QEListing listing = QEListing.eListing; 

     return listing.masterId.externalId.equalsIgnoreCase(externalId).and(
      listing.masterId.provider.id.eq(providerId)); 
    } 
} 

Wenn ich Auflistung zuzugreifen versuchen. masterId.provider in ListingPredicates.byMasterExternalIdAndProviderId(), Provider ist null, trotz der Tatsache, dass ichverwendet habe.

Wenn ich die Schaffung der Querydsl „Q“ Klassen debuggen, es gibt keine init Pfade für die masterId.

Kann mir bitte jemand erklären, warum meine @QueryInit nicht funktioniert?

Updates:

QEListing Klasse:

/** 
* QEListing is a Querydsl query type for EListing 
*/ 
@Generated("com.mysema.query.codegen.EntitySerializer") 
public class QEListing extends EntityPathBase<EListing> { 

    private static final long serialVersionUID = -1539977778; 

    private static final PathInits INITS = PathInits.DIRECT; 

    public static final QEListing eListing = new QEListing("eListing"); 

    public final com.mycompany.core.model.account.QEAccount account; 

    public final StringPath address = createString("address"); 

    public final StringPath address2 = createString("address2"); 

    public final StringPath businessName = createString("businessName"); 

    public final com.mycompany.core.model.location.QECity city; 

    public final SetPath<com.mycompany.core.model.listing.contact.EListingContact, com.mycompany.core.model.listing.contact.QEListingContact> contactInfo = this.<com.mycompany.core.model.listing.contact.EListingContact, com.mycompany.core.model.listing.contact.QEListingContact>createSet("contactInfo", com.mycompany.core.model.listing.contact.EListingContact.class, com.mycompany.core.model.listing.contact.QEListingContact.class, PathInits.DIRECT); 

    public final DateTimePath<java.util.Calendar> createdDate = createDateTime("createdDate", java.util.Calendar.class); 

    public final SetPath<com.mycompany.core.model.listing.contact.EEnhancedInfo, com.mycompany.core.model.listing.contact.QEEnhancedInfo> enhancedInfo = this.<com.mycompany.core.model.listing.contact.EEnhancedInfo, com.mycompany.core.model.listing.contact.QEEnhancedInfo>createSet("enhancedInfo", com.mycompany.core.model.listing.contact.EEnhancedInfo.class, com.mycompany.core.model.listing.contact.QEEnhancedInfo.class, PathInits.DIRECT); 

    public final SetPath<EExternalId, QEExternalId> externalIds = this.<EExternalId, QEExternalId>createSet("externalIds", EExternalId.class, QEExternalId.class, PathInits.DIRECT); 

    public final SetPath<com.mycompany.core.model.heading.EHeading, com.mycompany.core.model.heading.QEHeading> headings = this.<com.mycompany.core.model.heading.EHeading, com.mycompany.core.model.heading.QEHeading>createSet("headings", com.mycompany.core.model.heading.EHeading.class, com.mycompany.core.model.heading.QEHeading.class, PathInits.DIRECT); 

    public final SetPath<EHoursOfOperation, QEHoursOfOperation> hoursOfOperations = this.<EHoursOfOperation, QEHoursOfOperation>createSet("hoursOfOperations", EHoursOfOperation.class, QEHoursOfOperation.class, PathInits.DIRECT); 

    public final NumberPath<Long> id = createNumber("id", Long.class); 

    public final NumberPath<java.math.BigDecimal> latitude = createNumber("latitude", java.math.BigDecimal.class); 

    public final NumberPath<java.math.BigDecimal> longitude = createNumber("longitude", java.math.BigDecimal.class); 

    public final QEExternalId masterId; 

    public final DateTimePath<java.util.Calendar> modifiedDate = createDateTime("modifiedDate", java.util.Calendar.class); 

    public final SetPath<EDataProvider, QEDataProvider> removeForProviders = this.<EDataProvider, QEDataProvider>createSet("removeForProviders", EDataProvider.class, QEDataProvider.class, PathInits.DIRECT); 

    public final SetPath<ESponsorship, QESponsorship> sponsorships = this.<ESponsorship, QESponsorship>createSet("sponsorships", ESponsorship.class, QESponsorship.class, PathInits.DIRECT); 

    public final com.mycompany.core.model.location.QEState state; 

    public final StringPath vanityName = createString("vanityName"); 

    public final com.mycompany.core.model.location.QEZipCode zipCode; 

    public final StringPath zipCodeExt = createString("zipCodeExt"); 

    public QEListing(String variable) { 
     this(EListing.class, forVariable(variable), INITS); 
    } 

    @SuppressWarnings("all") 
    public QEListing(Path<? extends EListing> path) { 
     this((Class)path.getType(), path.getMetadata(), path.getMetadata().isRoot() ? INITS : PathInits.DEFAULT); 
    } 

    public QEListing(PathMetadata<?> metadata) { 
     this(metadata, metadata.isRoot() ? INITS : PathInits.DEFAULT); 
    } 

    public QEListing(PathMetadata<?> metadata, PathInits inits) { 
     this(EListing.class, metadata, inits); 
    } 

    public QEListing(Class<? extends EListing> type, PathMetadata<?> metadata, PathInits inits) { 
     super(type, metadata, inits); 
     this.account = inits.isInitialized("account") ? new com.mycompany.core.model.account.QEAccount(forProperty("account"), inits.get("account")) : null; 
     this.city = inits.isInitialized("city") ? new com.mycompany.core.model.location.QECity(forProperty("city"), inits.get("city")) : null; 
     this.masterId = inits.isInitialized("masterId") ? new QEExternalId(forProperty("masterId"), inits.get("masterId")) : null; 
     this.state = inits.isInitialized("state") ? new com.mycompany.core.model.location.QEState(forProperty("state")) : null; 
     this.zipCode = inits.isInitialized("zipCode") ? new com.mycompany.core.model.location.QEZipCode(forProperty("zipCode"), inits.get("zipCode")) : null; 
    } 

} 

Pom Config für Maven apt-Plugin:

<plugin> 
    <groupId>com.mysema.maven</groupId> 
    <artifactId>maven-apt-plugin</artifactId> 
    <version>1.0.4</version> 
    <executions> 
     <execution> 
      <goals> 
       <goal>process</goal> 
      </goals> 
      <configuration> 
       <outputDirectory>target/generated-sources</outputDirectory> 
       <processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor> 
       <!-- <logOnlyOnError>true</logOnlyOnError> --> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 
+0

Wie sieht 'QEListing' aus? –

+0

@ TimoWestkämper Danke für die Antwort. Ich habe meine Frage mit der vollständigen QEListing-Klasse aktualisiert. Die Tatsache, dass Sie die generierte Klasse aufgerufen haben, ließ mich denken, dass es in der Generation, die das Problem verursacht, etwas sein könnte. Ich habe meine Plugin-Konfiguration zu meiner Frage hinzugefügt, habe aber auch in Maven Central (hier: http://mvnrepository.com/artifact/com.mysema.maven) nachgeschaut und festgestellt, dass es ein 'maven-apt-plugin' und ein 'apt-maven-plugin'. Ich benutze das erstere, aber sollte ich das letztere benutzen? Was ist der Unterschied? Sieht aus, als ob sie auf den gleichen Git Repo zeigen. – Luke

+0

@ TimoWestkämper Ich habe mein Problem herausgefunden, nur nicht sicher, warum es so funktioniert. Wenn ich die Annotation "@ QueryInit" auf meine Methode "getMasterId()" statt auf das Feld "masterId" setze, ändert sich die Zeile in der Klasse "QEListing", die das Feld "INITS" zu "new PathInits" ("*", "masterId") initialisiert .provider ");', anstatt 'private statische finale PathInits INITS = PathInits.DIRECT;'. Wenn Sie so freundlich sind, den Grund dafür zu erklären, werde ich Ihre Antwort akzeptieren. Vielen Dank für Ihre Hilfe (dies ist nicht das erste Mal, dass Sie auf eine meiner Fragen zu Querydsl geantwortet haben) und für ein wunderbares Produkt. – Luke

Antwort

8

Die Querydsl JPA-Annotation-Prozessor auf einem Klassenbasis entscheidet, ob Felder, Accessoren oder beide werden bei der Inspektion berücksichtigt, basierend darauf, wo relevante Anmerkungen verwendet werden. In dieser Phase werden nur JPA-Anmerkungen berücksichtigt.

Da Ihre JPA-Annotationen in den Gettern definiert sind, muss die QueryInit-Annotation ebenfalls dort eingefügt werden.