2016-05-31 84 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