我在我的应用程序中使用Slick进行数据库操作(使用Postgres作为数据库)。我在尝试构建通用查询时遇到了一些问题。 我在SO中提出了一个问题,即使用表名而不是别名(here),但发现它不可能。
所以我现在正试图在Slick方面修复这个问题。
def ++= (selectStatement:String) ={
this.customSelectStatement = Some(selectStatement + " E where " + getQuery(filterPropertyList))
}
filterQuery ++= (TableQuery[SkillTable] innerJoin TableQuery[SkillCategoryTable] on (_.skillCategoryId === _.id)).sortBy(_._1.id).map{ case (a,at) => (a.id,a.name,at.name)}.selectStatement
val result = filter[SkillContainer](filterQuery)
方法getQuery
构建一个SQL,其中条件查询基于它接收的属性。我正在使用Slick表达式构建select子句,然后将其转换为SQL查询,然后附加通过getQuery
构建的where条件。
当我运行代码时,查询生成如下:
SELECT x2.x3,
x2.x4,
x5.x6
FROM (
SELECT x7."SkillId" AS x3,
x7."Name" AS x4,
x7."Description" AS x8,
x7."IsRemoved" AS x9,
x7."SkillCategoryId" AS x10
FROM "base"."Skill" x7
) x2
INNER JOIN (
SELECT x11."SkillCategoryId" AS x12,
x11."Name" AS x6,
x11."Description" AS x13,
x11."IsRemoved" AS x14
FROM "base"."SkillCategory" x11
) x5 ON x2.x10 = x5.x12
WHERE base."Skill"."IsRemoved" = 'false'
LIMIT 10 offset 0
但上述查询将失败,因为{S}生成带有别名的查询,因此base."Skill"."IsRemoved"
将无法解析。但是,如果我将其更改为x2.x9 = 'false'
,则查询将成功执行。
where条件查询是由getQuery
方法构建的,它不知道要使用的别名。
有什么办法我可以让Slick不为列生成别名,并在表达式本身提供子查询别名( x2 ),这样我就可以控制子的别名了查询。?
答案 0 :(得分:0)
“maybefilter”可能允许您使用类型安全的Slick api执行此操作,而无需连接SQL字符串。 https://gist.github.com/cvogt/9193220
除此之外,在可能的情况下删除别名对查询编译器来说是一个很好的改进,我有时也会这样做。请添加票证:https://github.com/slick/slick/issues