Spring数据:findByEntityNot()在多对多关系中

时间:2017-12-21 14:59:57

标签: java mysql spring jpa spring-data

我有以下多对多的关系:

@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;

}

现在我想查询所有Foo的FooRepository,它不包含名为“example”的Bar。我试图在FooRepository中使用以下Spring数据方法:

findByBars_NameNot(String barName);

但是这会返回数据透视表foo_bar的每个条目之一,其条形码列中没有“example”。这意味着它可以返回重复的Foo对象以及实际包含名为“example”的Bar的Foo对象,即它等同于以下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")

1 个答案:

答案 0 :(得分:1)

来自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);
}

很遗憾,query creation from method names

中不支持EXISTS次查询