【发布时间】:2014-01-09 07:18:31
【问题描述】:
我使用jOOQ 遇到了一个问题。我可以在mapper/table 中包含动态列吗?
SQL
CREATE TABLE "PartnerCategory"
(
"ID" uuid NOT NULL,
"Name" character varying(200),
"Description" character varying,
"ParentId" uuid,
"Visible" boolean,
CONSTRAINT "PartnerCategory_PK" PRIMARY KEY ("ID")
)
WITH (
OIDS=FALSE
);
ALTER TABLE "PartnerCategory"
OWNER TO postgres;
和
val SQL_CTE =
"""
WITH recursive cte1 as (
select pc."ID", pc."Name", pc."Description", pc."ParentId", pc."Visible", CAST(pc."Name" as text) as Path
from "PartnerCategory" pc where pc."ParentId" IS NULL
union
select pc."ID", pc."Name", pc."Description", pc."ParentId", pc."Visible", ct.Path || ' | ' || CAST(pc."Name" as text) as Path
from "PartnerCategory" pc
join cte1 ct on pc."ParentId" = ct."ID" )
select ct."ID", ct."Name", ct."Description", ct."ParentId", ct."Visible", ct.Path from cte1 ct
""".stripMargin
代码
在上面的查询中,我们有来自PartnerCategory 的所有列和一列是动态的Path。
以前为了让这一切正常工作,我手动迭代了结果:
val x: Seq[PartnerCategory] = for (i <- abcd.asScala)
yield PartnerCategory(
UUID.fromString(i.getValue(0).toString),
i.getValue(1).toString,
i.getValue(2).toString,
i.getValue(3) match {
case null => None
case f: UUID => Some(UUID.fromString(f.toString))
},
false,
i.getValue(5).toString)
我有这个表的自定义映射器:
class PartnerCategoryMapper extends RecordMapper[PartnercategoryRecord, PartnerCategory] {
def map(r: PartnercategoryRecord): PartnerCategory = {
val pc = PartnerCategory(r.getId, r.getName, r.getDescription, Some(r.getParentid), r.getVisible, "")
pc.IsNew = false
pc
}
}
我的模型看起来像:
case class PartnerCategory(var ID: UUID,var Name: String, var Description: String, var ParentId: Option[UUID], var Visible: Boolean, Path: String)
我尝试编写更好的代码,我发现这几乎完美无缺。我只是松散了有关动态列Path的信息:
val F = model.jooq.tables.Partnercategory.PARTNERCATEGORY
val mapper = new PartnerCategoryMapper()
val record = new PartnercategoryRecord()
ctx.fetch(SQL_CTE).into(F).map(mapper).asScala
问题
如何使用 1 个额外的列获取另一个映射器,例如:
class PartnerCategoryMapperDynamic extends RecordMapper[PartnercategoryRecordWithPath, PartnerCategory] {
def map(r: PartnercategoryRecordWithPath): PartnerCategory = {
val pc = PartnerCategory(r.getId, r.getName, r.getDescription, Some(r.getParentid), r.getVisible, r.getPath)
pc.IsNew = false
pc
}
}
【问题讨论】: