我目前使用下面的方法来重用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}")
}
1条答案
按热度按时间oknwwptz1#
这可能只是一个理解如何组合不同元素以实现你想要的东西的问题。可能,这对你有用吗?
顺便说一句,这也是你在原生PostgreSQL中的做法。在PostgreSQL或标准SQL中没有
ROW(SELECT ..)
构造函数,就像有MULTISET(SELECT ..)
构造函数一样。如果要重用
row()
表达式,只需将其赋给局部变量或方法,就像在jsonObject()
中所做的那样。