我是否需要在不加入 jooq 的情况下为查询创建新的简单实体?

Do I need create new simple entity for query without join in jooq?

我有一些看起来像这样的实体:

data class ComplexEntity(
   private val id: UUID,
   private val srcSomethingId: UUID,
   private val dstSomethingId: UUID,
   private val creationDate: LocalDateTime,
   private val updatingDate: LocalDateTime?,
   private val creationAuthorId: UUID,
   private val updatingAuthorId: UUID?,
   private val roles: List<UUID>,
   private val fieldsId: UUID,
   // relation
   private val srcSomething: SomethingEntity?,
   private val dstSomething: SomethingEntity?
)

它有关系,我正在将它与另一个 table 连接起来,但大多数时候我不需要关系,所以也许我需要创建更简化的实体,如投影或只保留关系不需要的字段 null

data class ComplexProjection (
   private val id: UUID,
   private val srcSomethingId: UUID,
   private val dstSomethingId: UUID,
   private val creationDate: LocalDateTime,
   private val updatingDate: LocalDateTime?,
   private val creationAuthorId: UUID,
   private val updatingAuthorId: UUID?,
   private val roles: List<UUID>,
   private val fieldsId: UUID
)

反之亦然,保持 ComplexProjection 像主要实体一样,因为它大部分时间都需要并将其称为 ComplexEntity 并使 ComplexEntityWithRelations 放置关系。

最好的方法是什么?

P.S。实际上,大多数时候我不需要所有这些字段,但我认为额外的 5 个字段不会对性能造成太大影响。

JPA 实体是一种数据建模方式,类似于 SQL 中的 CREATE TABLE。如果您合理地规范化事物,确实,您没有太多选择,无论是 SQL 形式还是 JPA 实体形式。

但是,由于所有错误的原因,人们也一直 投影 这些实体,即使使用 JPA,您也可以投影任意数据结构,就像使用 jOOQ 一样。你的 data classes 不是实体,它们是投射。这不是一回事。就像在 SQL 中,你可以为你的数据编写任意视图,而 SQL 不会告诉你这样做或那样做,jOOQ 对你的 预测没有意见.

所以,流程是这样的:

  1. 将您的模式规范化到足够的水平(例如 3NF)
  2. 根据需要设计查询(例如,UI 需要 table A 中的这 3 列和 table B 中的这 2 个嵌套集合)

就是这样。最好的查询以及针对您的个人需求的最佳预测自然而然地产生,来自您(团队)的偏好、您的数据表示、要求等。只要您能够以合理的方式表示事物,就不会对您的数据进行正确或错误的预测方式。