2016-05-31 88 views
1

我有一個看起來像這樣春數據JPA和泛型

@Entity(name = "encounter_pdf_export") 
public class EncounterPDFExport<T extends Encounter> implements Serializable { 

    public static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue 
    private Long pdfExportId; 

    @Any(metaColumn = @Column(name = "encounter_type")) 
    @Cascade(CascadeType.ALL) 
    @AnyMetaDef(
      idType = "long", 
      metaType = "string", 
      metaValues = { 
        @MetaValue(value = "FooEncounter", targetEntity = FooEncounter.class) 
      }) 
    @JoinColumn(name = "encounter_id") 
    private T encounter; 

我正在延伸出的抽象類型的實體是:

public abstract class Encounter { 

    public abstract Long getEncounterId(); 
} 

這裏是我的春節,數據倉庫

@Repository 
public interface EncounterPDFExportRepository extends PagingAndSortingRepository<EncounterPDFExport, Long> { 

    EncounterPDFExport findOneByEncounter_encounterId(@Param("encounterId") Long encounterId); 
} 

當啓動與findOneByEncounter_encounterId方法有關的應用程序時,我得到一個堆棧跟蹤:

Caused by: java.lang.IllegalArgumentException: Unable to locate Attribute with the the given name [encounter] on this ManagedType [com.iimassociates.distiller.domain.EncounterPDFExport] 
    at org.hibernate.jpa.internal.metamodel.AbstractManagedType.checkNotNull(AbstractManagedType.java:144) 
    at org.hibernate.jpa.internal.metamodel.AbstractManagedType.getAttribute(AbstractManagedType.java:130) 
    at org.springframework.data.jpa.repository.query.QueryUtils.toExpressionRecursively(QueryUtils.java:468) 
    at org.springframework.data.jpa.repository.query.JpaQueryCreator$PredicateBuilder.getTypedPath(JpaQueryCreator.java:300) 
    at org.springframework.data.jpa.repository.query.JpaQueryCreator$PredicateBuilder.build(JpaQueryCreator.java:243) 
    at org.springframework.data.jpa.repository.query.JpaQueryCreator.toPredicate(JpaQueryCreator.java:148) 
    at org.springframework.data.jpa.repository.query.JpaQueryCreator.create(JpaQueryCreator.java:88) 
    at org.springframework.data.jpa.repository.query.JpaQueryCreator.create(JpaQueryCreator.java:46) 
    at org.springframework.data.repository.query.parser.AbstractQueryCreator.createCriteria(AbstractQueryCreator.java:109) 
    at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:88) 
    at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:73) 
    at org.springframework.data.jpa.repository.query.PartTreeJpaQuery$QueryPreparer.<init>(PartTreeJpaQuery.java:116) 
    at org.springframework.data.jpa.repository.query.PartTreeJpaQuery$CountQueryPreparer.<init>(PartTreeJpaQuery.java:237) 
    at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:65) 
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:100) 

我假設Spring Data JPA不支持抽象/通用字段?如果是這種情況,創建一個@Query是一個充分的解決方法?

+0

看起來我可能會遇到這個問題:https://jira.spring.io/browse/DATAJPA-836 – delewis

回答

3

不知道這是否對任何人有用,但我確實得到了這個工作。

  1. 刪除了抽象類,並使其與一個單一的公共getEncounterId()方法的接口
  2. 改性FooEncounter實現上述接口
  3. 刪除從EncounterPDFExport類
  4. 泛型改性相遇字段利用上述接口而不是通用的
  5. 顯然,我在訪問FooEncounter中的字段時遇到了一些Hibernate bug /限制。然而,在EncounterPDFExport中訪問Encounter工作正常。我修改了我的春天JPA的數據存儲庫看起來像以下(注意從encounter.encounterId主場迎戰剛剛遭遇找到修改):

    @Repository 
    public interface EncounterPDFExportRepository extends PagingAndSortingRepository<EncounterPDFExport, Long> { 
    
        EncounterPDFExport findOneByEncounter(@Param("encounter") Encounter encounter); 
    } 
    

問題Hibernate的錯誤似乎與https://jira.spring.io/browse/DATAJPA-836