2017-12-21 2 views
0

Ich habe folgendes viele zu viele Beziehung:Spring Data: findByEntityNot() in einer viele zu viele Beziehung

@Entity 
public class Foo implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @JsonIgnore 
    @ManyToMany 
    @JoinTable(name = "foo_bar", 
     joinColumns = {@JoinColumn(name = "foo_id", referencedColumnName = "id")}, 
     inverseJoinColumns = {@JoinColumn(name = "bar_name", referencedColumnName = "name")}) 
    private Set<Bar> bars = new HashSet<>(); 

} 

@Entity 
public class Bar implements Serializable { 

    @Id 
    private String name; 

} 

Jetzt habe ich die FooRepository für alle Foo abfragen möchten, die nicht über eine Bar mit dem Namen enthalten "Beispiel". Ich habe versucht, die folgenden Frühling Daten Methode in FooRepository zu verwenden:

findByBars_NameNot(String barName); 

Aber das gibt einen von jedem Eintrag der Pivot-Tabelle foo_bar, die nicht „example“ in seiner bar_name Spalte hat. Das bedeutet, es zurückgeben kann doppelt Foo sowie Foo Objekt Objekte, die eigentlich eine Bar mit dem Namen „Beispiel“ enthalten, dh es in dem folgenden SQL-äquivalent ist:

SELECT * FROM myschema.foo_bar WHERE bar_name != "example"; 

Gibt es eine schöne Möglichkeit, im Frühjahr Daten ein schreiben Repository-Methode zu tun, was ich versuche?

Ich habe die folgende nativen Abfrage gefunden, die tut, was ich brauche, aber ich bin zögerlich eine native Abfrage zu verwenden, wie ich es fühle, ist ein sauberer Weg, dies zu tun:

SELECT * FROM myschema.foo WHERE id NOT IN (SELECT foo_id FROM myschema.foo_bar WHERE bar_name = "example") 

Antwort

1

Von Spring Data JPA docs

public interface FooRepository extends JpaRepository<Foo, Long> { 

    @Query("SELECT f FROM Foo f WHERE NOT EXISTS (SELECT b FROM f.bars b WHERE b.name = ?1)") 
    Foo findByNotHavingBarName(String name); 
} 

Leider gibt es keine Unterstützung für EXISTS Abfragen in den query creation from method names

+0

Danke für die Antwort! Es ist eine Schande, dass es keine Unterstützung für die Nomenklatur im Frühjahr gibt, aber das ist sicherlich viel aufgeräumter als das, was ich versuchte! – Plog