2016-05-31 13 views
1

Ich habe eine Entität, dieSpring Data JPA und Generics

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

Die abstrakte Art wie diese aussieht, dass ich erstreckt:

public abstract class Encounter { 

    public abstract Long getEncounterId(); 
} 

Hier mein Spring Data Repository ist

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

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

Ich bekomme einen Stack-Trace beim Starten der Anwendung in Bezug auf die findOneByEncounter_encounterId-Methode:

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) 

Ich gehe davon aus, dass entweder Spring Data JPA nicht abstrahiert/generic Felder nicht unterstützt? Wenn dies der Fall ist, wäre das Erstellen einer @Query eine ausreichende Problemumgehung?

+0

Sieht so aus, als würde ich auf dieses Problem stoßen: https://jira.spring.io/browse/DATAJPA-836 – delewis

Antwort

3

Nicht sicher, ob dies für jeden hilfreich ist, aber ich habe das funktioniert.

  1. die abstrakte Klasse entfernt und machte es eine Schnittstelle mit einem einzigen öffentlichem getEncounterId() -Methode
  2. Modified FooEncounter der obigen Schnittstelle
  3. entfernt Generika von der EncounterPDFExport Klasse, um die Begegnung Feld
  4. Modified zu implementieren Verwenden Sie die obige Schnittstelle anstelle einer generischen
  5. Offenbar, ich bin ein paar Hibernate Bug/Einschränkung beim Zugriff auf Felder innerhalb FooEncounter. Der Zugriff auf Encounter innerhalb von EncounterPDFExport funktioniert jedoch OK. Ich änderte meine Spring Data JPA-Repository wie folgt aussehen (beachten Sie die Änderung von der Suche nach encounter.encounterId vs. gerade Begegnung):

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

Die Hibernate Fehler in Frage zu https://jira.spring.io/browse/DATAJPA-836 verwandt zu sein scheint.

Verwandte Themen