Java JPA, override findAll mit problemen

roker002

Commander
Registriert
Dez. 2007
Beiträge
2.061
habe eine Frage. Wenn ich findAll überschreiben möchte, sollte es eigentlich vollkommen ausreichen, wenn ich folgende Query drüber fahren lasse:
Code:
    @Override
    @Query("SELECT e FROM #{#entityName} e WHERE e.is_active = 1")
    List<T> findAll();
Komischerweise akzeptiert er die Abfrage nicht.
 
Ich nehm mal an es geht um Spring Data JPA. Habs schnell mal getestet von der Grundmechanik her funktioniert es. Bekommst du eine Fehlermeldung oder werden auch einfach elemente geliefert bei dennen is_active != 1 ist? (heißt das Feld wirklich is_active, das wäre ein ungewöhnlicher Java Variablenname)
Davon abgesehen, würd ich es in der Regel auch so nicht machen. Solch eine Bedingung hat nichts mit dem Data Access Layer zu tun und sollte im Service Layer realisiert werden.
Daher Methode änderung zu List<T> findAllActive();
Dazu einen Service Layer der dafür zuständig ist. Das Ganze könnte dann folgendermaßen aussehen.
Code:
@NoRepositoryBean
public interface GenericRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
    @Query("SELECT e FROM #{#entityName} e WHERE e.is_active = 1")
    List<T> findAllActive();
}


public abstract class ActiveAwareService<T, Repository extends GenericRepository<T> {

    // Spring 4 version
    @Autowird
    protected Repository repository;
    // Spring 4 end

    // Spring 3 version
    protected Repository repository;

    public ActiveAwareService(Repository repository) {
        this.repository = repository;
    }
    // Spring 3 end

    public List<T> allActive(){
        return repository.findAllActive();
    }
}

Hab jetzt im Forum getippt, daher man möge mir Tippfehler etc verzeihen. Das mit der Spring 4 und Spring 3 Version hängt halt davon ab welche Spring Version die du verwendest, glaub seit Spring 4 kann man generische Typen injecten. Bei Spring 3 musst du Konstruktor injection verwenden. In der Regel hat man auch noch eine Basis Model classe und fügt bei der generischen Definition noch T extends BasisModel hinzu, dann ist das Ganze Typesafe.

Ich vermute ich hab jetzt viel auf einmal gebracht, daher wenns Fragen gibt einfach her damit.
 
Zuletzt bearbeitet:
ich bekome eine Fehlermeldung. Schreib heute abend noch welche. Muss jetzt zur Arbeit!
Aber, so wie ich sehe, hast du eine neue Methode ins Repository geschrieben. Ich wollte die findAll einfach überschreiben, da diese an mehreren Stellen benutzt wird!
 
Gehen sollte beides. Ich hab nur angemerkt, dass ich es von der Software Engineering sicht nicht machen würde.
In der Regel verwendet man die findAll() Methode so oder so nicht, da meist pagination benötigt wird wenn man alle ausgeben will. Aber das is dann wieder eine andere Geschichte.
 
Zurück
Oben