2017-04-11 3 views
2

Ich versuche Spring JPA-Projektion zu verwenden, um unnötige Daten aus Abfrageergebnis herauszufiltern. Ich habe jedoch mehrere Projektionen, die für die gleiche Schnittstellenmethode verwendet werden müssen.Spring JPA: Verwenden mehrerer Projektion auf derselben Abfrage-Schnittstelle

Das Problem ist, ich versuche, Daten von der gleichen Methode mit einem anderen zurückgebenden Objekt abzufragen, aber Java erlaubt dies nicht.

Die Abfrage wird automatisch von JPA basierend auf dem Methodennamen generiert, sodass ich den Methodennamen nicht ändern kann.

Gibt es eine Alternative, andere als eine neue Schnittstelle zu schaffen, da ich es ist ein Streit denken und unnötiger

hier ist ein Beispielcode, von dem, was ich zu tun versuchen.

Auto-Generated Query

public interface UserRepository extends CrudRepository<UserAccount, Long> { 

    AuthenticateProjection getByUsername(String username); 

    UserDetailsProjection getByUsername(String username); 

} 

Projections

public interface AuthenticateProjection { 

    @Value("#{target.username}") 
    String getUsername(); 

    @Value("#{target.credentail.token}") 
    String getHashPassword(); 
} 

public interface UserDetailsProjection { 

    @Value("#{target.username}") 
    String getUsername(); 

    @Value("#{target.firstname}") 
    String getFirstName(); 

    @Value("#{target.lastname}") 
    String getLastName(); 
} 
+0

Warum Sie auf „Filter“, um die Informationen fehlen - ist das von einer Steuerung für die Rückgabe oder für die interne benutzen? – chrylis

+0

@chrylis wird es wieder auf den Controller – XPLOT1ON

Antwort

2

So habe ich es geschafft habe, um herauszufinden, wie man mit einer einzigen Abfrage mehrere Projektionen zu verwenden.

Dadurch kann der Methodenaufruf den Projektionstyp angeben, der auf die Abfrage angewendet werden soll.

Um dies weiter zu verbessern, so dass es weniger fehleranfällig ist, habe ich eine leere Schnittstelle erstellt, die die Projektion erweitern muss, um eine Klasse in den Parameter einfügen zu können.

public interface JPAProjection { 
} 

public interface UserRepository extends CrudRepository<UserAccount, Long> { 
    <T extends JPAProjection > T getByUsername(String username, Class<? extends JPAProjection> projection); 
} 

Projection Interface

public interface UserDetailsProjection extends JPAProjection{ 
    @Value("#{target.username}") 
    String getUsername(); 

    @Value("#{target.firstname}") 
    String getFirstname(); 

    @Value("#{target.lastname}") 
    String getLastname(); 
} 

Dann kann ich die Abfrage-Methode aufrufen, indem

getByUsername("...", UserDetailsProjection.class) 
+0

Ich habe versucht, Ihre gleiche Lösung zu verwenden, aber es funktioniert nicht für mich. In der Eclipse-Konsole sehe ich einen Fehler: 'verursacht durch: org.hibernate.hql.internal.ast.QuerySyntaxException: unerwartetes Token: aus der Nähe von Zeile 1, Spalte 9 [wählen Sie aus com.app.company.domain.organization.Organisation als generatedAlias0 wobei generatedAlias0.DeletedAt ist null] '. Sehen Sie sich die Anweisung "select" an: Es gibt keine Spalte. Hattest du vielleicht das gleiche Problem? Es scheint, dass das Repository nicht den richtigen Projektionstyp erhält ..... irgendeine Idee? Danke vielmals! –

+0

hmm das ist seltsam. Ich hatte kein Problem. Würde es dir etwas ausmachen, deinen Impl anzuhängen? Pastebin vielleicht? @AndreaBevilacqua – XPLOT1ON