2016-08-09 95 views
0

Kürzlich habe ich gelernt, es gibt @Where Annotation, und ich kann es erfolgreich auf meiner @Entity Klasse verwenden. Sieht so aus, als ob dieser Filter auf jede Abfrage angewendet wird. Und ich stellte das Problem, wenn ich versuche, diese weich gelöschte Entität als Element der Sammlung in einem anderen @Entity zu bekommen.So filtern Sie gelöschte Elemente in der findAll() -Methode von Spring Data?

kann nicht SoftDeletedEntity mit id xx (durch Referenzkette finden ...

Jetzt will ich versuchen, diese @Where nur auf SpringData findAll() Methode des Repo-Filter zu verwenden. Ich habe versucht, die folgenden, aber es hat nicht funktioniert.

public interface MyEntity extends JpaRepository<MyEntity, Long> { 

    @Where(clause = "is_deleted = 'false'") 
    @Override 
    List<MyEntity> findAll(); 
} 

ist es möglich, überhaupt

?
+0

Ich glaube nicht. Um Querydsl zu verwenden, benutze es in der Namensmethode direkt, etwa so: findAllByIsDeletedFalse() -> Siehe: http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query -methods.named-queries '@Where (clause =" is_deleted = 'false' ")' ist dasselbe wie 'findAllByIdIsDeletedFalse()' – Pau

+0

'List findByIsDeletedFalse();' sollte in Spring Data JPA funktionieren –

Antwort

3

Wenn Sie Hibernate und @Where verwenden, gibt es keine einfache Lösung Ihre Frage (sie wird von Hibernate gefiltert, nicht von Federdaten). Aber man kann einen anderen Ansatz betrachten zu Ausdruckssprache Sie weichen löschen und Abfrage mit Federdaten:

@Override 
@Query("select e from #{#entityName} e where e.deleteFlag=false") 
public List<T> findAll(); 

//recycle bin 
@Query("select e from #{#entityName} e where e.deleteFlag=true") 
public List<T> recycleBin(); 

@Query("update #{#entityName} e set e.deleteFlag=true where e.id=?1") 
@Modifying 
public void softDelete(String id); 
//#{#entityName} will be substituted by concrete entity name automatically. 

Rewrite Basis-Repository wie folgt aus. Alle Unter-Repository-Schnittstellen verfügen über die Fähigkeit zum Löschen.

+0

Wenn alle Ihre Objekte muss Soft Delete Fähigkeit haben, es ist in Ordnung, aber was, wenn Sie diese Soft-Lösch-Fähigkeit für nur ein einzelnes Objekt wollen? Die anderen werden nur aus der Datenbank gelöscht. Dann lautet die Antwort Pau's Kommentar: findAllByIsDeletedFalse() im DAO des Objekts. – obeliksz

+0

Hat jemand JpaObjectRetrievalFailureException mit dieser Methode des Abrufs von Auslagerungsdaten mit PagingAndSortingRepository konfrontiert? –