У меня есть много разных отношений:
@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;
}
Теперь я хочу запросить FooRepository для всех Foo, которые НЕ содержат панель с именем "example". Я попытался использовать следующий метод данных Spring в FooRepository:
findByBars_NameNot(String barName);
Но это возвращает одну из каждой записи сводной таблицы foo_bar, которая не имеет "пример" в столбце bar_name. Это означает, что он может возвращать повторяющиеся объекты Foo, а также объект Foo, который фактически содержит панель с именем "example", то есть эквивалентна следующему SQL:
SELECT * FROM myschema.foo_bar WHERE bar_name != "example";
Есть ли хороший способ в Spring данных написать метод репозитория, чтобы сделать то, что я пытаюсь?
Я нашел следующий основной запрос, который делает то, что мне нужно, но я не решаюсь использовать собственный запрос, поскольку я чувствую, что есть более чистый способ сделать это:
SELECT * FROM myschema.foo WHERE id NOT IN (SELECT foo_id FROM myschema.foo_bar WHERE bar_name = "example")
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);
}
К сожалению, нет поддержки запросов EXISTS
в создании запроса из имен методов