kotlin 使用jOOQ多集或行而不是jsonObject

rjee0c15  于 2022-11-16  发布在  Kotlin
关注(0)|答案(1)|浏览(91)

我目前使用下面的方法来重用select语句。这种方法非常好用,但是这种方法不能为我提供类型安全,因为它是json函数。因此,我想引入相同的模式来使用multiset对嵌套的集合进行select查询,使用row对嵌套的单个对象进行select查询,而不使用jsonObject。
第一个
我正在寻找一种不使用jsonObject的可能方法,如下所示(下面的方法不起作用,但只是为了展示我的想法。)

override fun fetch(query: FetchFoodByIdQuery): FoodRecord {
    return ctx.getContext()
      .select(
        food.ID,
        food.CREATED_AT,
        row(
          select( // This select should be reused (same as lastModifiedBy)
            user.ID,
            user.NICKNAME,
            user.ROLE
          ).from(user)
            .where(user.ID.eq(food.CREATED_BY)) 
        ).`as`("createdBy"),
        food.LAST_MODIFIED_AT,
        row(
          select( // This select should be reused (same as createdBy)
            user.ID,
            user.NICKNAME,
            user.ROLE
          ).from(user)
            .where(user.ID.eq(food.LAST_MODIFIED_BY)) 
        ).`as`("lastModifiedBy"),
        multiset(
          select(foodSynonym.SYNONYM).from(foodSynonym)
            .where(foodSynonym.FOOD_ID.eq(food.ID))
        ).`as`("synonyms")
      )
      .from(food)
      .where(food.ID.eq(query.id))
      .fetchOneInto(FoodRecord::class.java)
      ?: throw NoResultFoundException("Food is not found by id: ${query.id}")
  }
oknwwptz

oknwwptz1#

这可能只是一个理解如何组合不同元素以实现你想要的东西的问题。可能,这对你有用吗?

field(
  select(
    row(
      user.ID,
      user.NICKNAME,
      user.ROLE
    )
  ).from(user)
   .where(user.ID.eq(food.CREATED_BY)) 
).`as`("createdBy")

顺便说一句,这也是你在原生PostgreSQL中的做法。在PostgreSQL或标准SQL中没有ROW(SELECT ..)构造函数,就像有MULTISET(SELECT ..)构造函数一样。
如果要重用row()表达式,只需将其赋给局部变量或方法,就像在jsonObject()中所做的那样。

相关问题