我是否需要为jooq中没有join的查询创建新的简单实体?



我有一个像这样的实体:

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?
)

它有关系,我将它与另一个表连接,但大多数时候我不需要关系,所以也许我需要创建更简化的实体,如投影或只是在不需要时保留关系字段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放置关系。

最好的方法是什么?

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

JPA实体是对数据建模的一种方式,类似于SQL中的CREATE TABLE。如果你合理地规范化事情,事实上,你不会有太多的选择,无论是以SQL的形式还是以JPA实体的形式。

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

那么,过程是这样的:

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

就是这样。根据您(团队)的偏好、数据表示、需求等,最佳查询和最佳投影自然会出现。你的数据没有正确或错误的投影,只要你能以合理的方式表示事物。

最新更新