Micronaut Data JDBC 嵌套实体

Gar*_*ary 6 kotlin micronaut-data

我一直在研究使用 Micronaut Data JDBC 作为现有 jdbi 查询的增强。是否可以执行嵌套 MappedEntity 并返回子项?

示例是一个简单的仓库管理系统,其关系如下:

company
+- warehouse
   +- inventory
Run Code Online (Sandbox Code Playgroud)

我想要做的是从表中查询inventory并获取 的父级warehouse和祖级company。这是一种一对多的关系,一个公司能够拥有多个仓库,一个仓库能够拥有多个库存。

我的实体看起来像

我一直在玩的示例项目位于wms-api

company
+- warehouse
   +- inventory
Run Code Online (Sandbox Code Playgroud)
@JdbcRepository
interface CompanyRepository : PageableRepository<Company, UUID>


@MappedEntity
data class Company(

   @field:Id
   @field:GeneratedValue
   var id: UUID? = null,

   @field:GeneratedValue
   var timeCreated: OffsetDateTime? = null,

   @field:GeneratedValue
   var timeUpdated: OffsetDateTime? = null,

   var name: String
)
Run Code Online (Sandbox Code Playgroud)
@JdbcRepository
interface WarehouseRepository : GenericRepository<Warehouse, UUID> { // used GenericRepository to allow the mapping of Company

   @Join(value = "company")
   fun findById(id: UUID): Warehouse?

   @Join(value = "company")
   fun findByCompany(company: Company, pageable: Pageable): Slice<Warehouse>

   @Join(value = "company")
   fun findAllByCompany(company: Company, pageable: Pageable): Slice<Warehouse>

   @Join(value = "company")
   fun existsByLocationAndCompany(location: String, company: Company): Boolean

   fun save(warehouse: Warehouse): Warehouse

   fun update(warehouse: Warehouse): Warehouse
}

@MappedEntity
data class Warehouse(

   @field:Id @field:GeneratedValue
   var id: UUID? = null,

   @field:GeneratedValue
   var timeCreated: OffsetDateTime? = null,

   @field:GeneratedValue
   var timeUpdated: OffsetDateTime? = null,

   var location: String,

   @field:Relation(value = MANY_TO_ONE)
   var company: Company
)
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪的相关部分

Caused by: io.micronaut.core.reflect.exception.InstantiationException: Null argument specified for [company]. If this argument is allowed to be null annotate it with @Nullable
    at io.micronaut.core.beans.AbstractBeanIntrospection.instantiate(AbstractBeanIntrospection.java:121)
    at io.micronaut.core.beans.BeanIntrospection.instantiate(BeanIntrospection.java:81)
    at io.micronaut.data.runtime.mapper.sql.SqlResultEntityTypeMapper.readEntity(SqlResultEntityTypeMapper.java:345)
Run Code Online (Sandbox Code Playgroud)

如果可能的话,我不想将 Warehouse.company 属性设为可选。

在链接的项目中,有一个支持的 docker-compose.yml 可用于启动 Postgres,然后运行测试套件,问题应该会以失败的形式弹出。

谢谢!

Gar*_*ary 9

弄清楚了。必须将 InventoryRepository 的findById方法更改为如下所示

@JoinSpecifications(
   Join(value = "warehouse"),
   Join(value = "warehouse.company")
)
fun findById(id: UUID): Inventory?
Run Code Online (Sandbox Code Playgroud)