【问题标题】:Remove alias in Slick generated queries在 Slick 生成的查询中删除别名
【发布时间】:2015-01-14 07:33:08
【问题描述】:

我在我的应用程序中使用 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 where 条件查询。我正在使用 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

但是上面的查询将会失败,因为base."Skill"."IsRemoved" 不会被解析,因为 I Slick 会生成带有别名的查询。但是,如果我将其更改为x2.x9 = 'false',则查询将成功执行。

where 条件查询是由getQuery 方法构建的,它不知道要使用的别名。 有什么方法可以让 Slick 不要为列生成别名,并在表达式本身中提供子查询别名(x2),这样我就可以控制子查询的别名查询。?

【问题讨论】:

    标签: postgresql scala slick


    【解决方案1】:

    “maybefilter”可能允许您使用类型安全的 Slick api 执行此操作,而无需连接 SQL 字符串。 https://gist.github.com/cvogt/9193220

    除此之外,在可能的情况下删除别名将是对查询编译器的一个很好的改进,我过去有时也想过。请加票:https://github.com/slick/slick/issues

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-08
      • 1970-01-01
      • 2014-05-08
      • 2018-09-26
      • 2015-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多