JPA计算相关实体而不加入它们

Mat*_*tzz 5 java oracle jpa eclipselink

我有两个实体:

@Entity
class X {
  @Id
  int id;
}

@Entity
class Y {
  @Id
  int id;

  @ManyToOne
  @JoinColumn(name = "x_id")
  X x;
}
Run Code Online (Sandbox Code Playgroud)

我想在y表中计算x_id的不同值.我试过了:

select count(distinct Y.x) from Y;
Run Code Online (Sandbox Code Playgroud)

它的工作原理,但在sql我加入x表是不合格的:

select count(distinct x.id) from y, x where y.x_id = x.id;
Run Code Online (Sandbox Code Playgroud)

这种加入对我来说是不必要的,也是非常昂贵 没有原生查询有没有办法避免它?

Ond*_*Mih 3

您可以尝试使用select count(distinct Y.x.id) from Y(Txid 而不是 Yx)。我不确定,但智能 JPA 实现应该发现只有 id 是必需的,并且不会添加连接。

另一种方法是向 Y 添加一个 int 字段,并将只读映射到 x_id 列:

@Entity
class Y {
  @Id
  int id;

  @ManyToOne
  @JoinColumn(name = "x_id")
  X x;

  @Column(name = "x_id", insertable = false, updatable = false, nullable = false)
  int xId;
}
Run Code Online (Sandbox Code Playgroud)

你的查询很简单select count(distinct Y.xId) from Y