Spring Data: findByEntityNot () во многих отношениях

0

У меня есть много разных отношений:

@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")
Теги:
spring
jpa
spring-data

1 ответ

1
Лучший ответ

Из данных Spring Data JPA

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 в создании запроса из имен методов

  • 0
    Спасибо за ответ! Жаль, что в именовании весенних методов данных не существует поддержки, но это, конечно, намного аккуратнее, чем то, что я пытался сделать!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню