2013-05-29 31 views
5

Tôi đang làm việc trên một dự án gần đây tôi đã thực hiện và đang cố gắng chuyển đổi để sử dụng Querydsl.Querydsl @QueryInit không hoạt động

Tôi có một lớp niêm yết:

@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; 
    } 

... 

} 

Và một lớp ID bên ngoài:

@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; 
    } 

} 

Tôi có một lớp ListingPredicates:

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)); 
    } 
} 

Khi tôi cố gắng để truy cập vào danh sách. masterId.provider trong ListingPredicates.byMasterExternalIdAndProviderId(), nhà cung cấp là null, mặc dù thực tế là tôi đã sử dụng QueryInit().

Nếu tôi gỡ lỗi việc tạo các lớp "Q" Querydsl, không có đường dẫn init cho masterId.

Ai đó có thể giải thích lý do tại sao @QueryInit của tôi không hoạt động?

Cập nhật:

QEListing lớp:

/** 
* 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 cấu hình cho maven Plugin apt:

<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

Làm cách nào để hiển thị 'QEListing'? –

+0

@ TimoWestkämper Cảm ơn bạn đã phản hồi. Tôi đã cập nhật câu hỏi của mình với lớp QEListing đầy đủ. Thực tế là bạn đã đưa ra những gì các lớp học tạo ra trông giống như làm cho tôi nghĩ rằng nó có thể là một cái gì đó trong thế hệ đó gây ra vấn đề. Tôi đã thêm cấu hình plugin cho câu hỏi của mình, nhưng cũng nhìn lại Maven Central (ở đây: http://mvnrepository.com/artifact/com.mysema.maven) và nhận thấy rằng có một 'maven-apt-plugin' và một 'apt-maven-plugin'. Tôi đang sử dụng cái cũ, nhưng tôi có nên sử dụng cái sau không? Sự khác biệt là gì? Có vẻ như họ chỉ vào cùng một repo git. – Luke

+0

@ TimoWestkämper Tôi đã tìm ra vấn đề của mình, không chắc tại sao nó hoạt động theo cách này. Đặt chú thích '@ QueryInit' vào phương thức' getMasterId() 'thay vì trên trường' masterId' thay đổi dòng trong lớp 'QEListing' khởi tạo trường' INITS' thành 'new PathInits (" * "," masterId .provider ");', chứ không phải 'riêng cuối cùng tĩnh PathInits INITS = PathInits.DIRECT;'. Nếu bạn muốn giải thích lý do cho điều này, tôi sẽ chấp nhận câu trả lời của bạn. Cảm ơn sự giúp đỡ của bạn cho đến nay (đây không phải là lần đầu tiên bạn trả lời một trong những câu hỏi của tôi về Querydsl) và cho một sản phẩm tuyệt vời. – Luke

Trả lời

8

Bộ xử lý chú thích Querydsl JPA quyết định trên cơ sở lớp học nếu các lĩnh vực, accessors hoặc cả hai đều được tính đến trong thanh tra, dựa trên nơi sử dụng chú thích có liên quan. Chỉ chú thích JPA mới được xem xét trong giai đoạn này.

Vì chú thích JPA của bạn được xác định trong getters, chú thích QueryInit cũng cần phải được đặt ở đó.