首页 > 解决方案 > JPA 计数成员

问题描述

@Query("select count(s) from S s, TG tg where s.id = :id and tg member of s.tgs and :user member of tg.members")
@Query("select count(s) from S s, TG tg, FG fg where s.id = :id and tg member of s.tgs and :user member of fg.members and fg member of tg.members")
@Query("select count(s) from S s, TG tg, FG fg where s.id = :id and tg member of s.tgs and (:user member of tg.members or :user member of fg.members and fg member of tg.members)")

我在 JPA 中有 3 个查询。目标是计算用户是成员的 S 实体的数量。S实体与两种组TG(直接)和FG(可以是TG的成员)链接。用户可以是 TG 或 FG 的成员。

如您所见,第三个是两个第一个的相加。

这两个第一个请求似乎有效,但第三个......:

  1. 当我有 0 个用户时,3 个请求返回 0(预期)
  2. 当我在 TG 中添加用户时,第一个返回 1(预期),第二个 0(预期)和第三个 0(不预期
  3. 当我在 TG 中的 FG 中添加用户时,3 个请求返回 1(没想到我必须有 2 个)
  4. 当用户只在FG中时,第一个请求返回0(预期),另外两个返回1(预期)

看不懂!!!为什么第三个查询没有返回第一个和第二个查询的结果???

编辑:实体(模式由 JPA 自动生成)

    @Entity
public class S {

  @Id
  @GeneratedValue
  public long id;

  @ManyToMany(cascade = CascadeType.ALL)
  @JoinTable(joinColumns = @JoinColumn(name = "s_id"), inverseJoinColumns = @JoinColumn(name = "tg_id"))
  private List<TG> tgs = new ArrayList<>();

  (...)

}

@Entity
public class TG extends G {

  @ManyToMany(mappedBy = "tgs", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
  private List<S> ss = new ArrayList<>();

  (...)

}


@Entity
public class FG extends G {

  @Column(nullable = false)
  public String uniqueName;

  (...)

}


@Entity(name = "groupe")
public abstract class G extends Subject {

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "membres")
    private Set<Subject> membres = new HashSet<>();

    (...)

}


@Entity
public class U extends Subject {

  @Column(unique = true, nullable = false)
  public String uniqueName;

  (...)

}


@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Subject {

  @Id
  @GeneratedValue
  public long id;

  (...)

}

标签: spring-bootjpajpql

解决方案


推荐阅读