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

标签 java oracle jpa eclipselink

我有两个实体:

@Entity
class X {
  @Id
  int id;
}

@Entity
class Y {
  @Id
  int id;

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

我想计算 y 表中 x_id 的不同值。我试过:

select count(distinct Y.x) from Y;

它可以工作,但在 sql 中我加入了 x 表,这是不正确的:

select count(distinct x.id) from y, x where y.x_id = x.id;

这个连接对我来说是不必要的,而且成本很高。如果没有原生查询,有什么办法可以避免吗?

最佳答案

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

另一种方法是将一个 int 字段添加到 Y,并只读映射到 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;
}

而您的查询将只是 select count(distinct Y.xId) from Y

关于java - JPA 计算相关实体而不加入它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32500255/

相关文章:

sql - 尝试插入 View 时无法修改映射到非键保留表错误的列

参数的Oracle "IN clause"

java - REGEX 匹配多个条件

java - #define STRING 在 Tomcat Java App 中等效

java - 从 docx4j 版本 2.X 迁移到 3.X

java - 乘以 ID 映射抛出 BaseEntity

java - 我应该在 JPA 实体中编写 equals() 和 hashCode() 方法吗?

java - 如何在每个循环实例的新行中将数据写入Excel工作表而不替换以前的数据,即如何为每个循环实例追加行?

sql函数添加每行值

mysql - 使用 JPA/Spring/Hibernate 自动截断字符串列的方法?