These are chat archives for scalikejdbc/ja

23rd
Mar 2016
lyrical logical
@lyricallogical
Mar 23 2016 07:22
QueryDSL だと難しいですね、interpolation の方と違って、変なクエリが構築できないように各メソッドのシグネチャが厳格なので簡単には騙せないし、偽者の SQLSyntaxSupport を作ろうにも、基本的に ConnectionPool からメタデータ取ってくる実装になっていて、そこは外から変更できないので…
Kazuhiro Sera
@seratch
Mar 23 2016 07:26
SQLSyntaxSupport を extends した CompanyName の companion object を定義せずに.. ということですよね。それは確かに QueryDSL だとできないです。
companion object である必要はないけれど SQLSyntaxSupport を extends した何かは必要。
lyrical logical
@lyricallogical
Mar 23 2016 07:33
試しに ConnectionPool 必要にならないように適当に override してその場で new して syntax 呼んだら QuerySQLSyntaxProvider で何か InvalidColunmNameException でて叱られましたね…
と思ったら syntax 呼ぶタイミング変えたら動いた 不思議が発見された
lyrical logical
@lyricallogical
Mar 23 2016 07:40
val foo = new SQLSyntaxSupport[Foo] {
  override def tableName = "foo"
  override def columns = Seq(...)
}
これは OK
val foo = new SQLSyntaxSupoprt[Foo] { ... } syntax
これはだめ(何故だ)
しかも例外が AbstractMethodError に変わった(ワオ)
Kazuhiro Sera
@seratch
Mar 23 2016 07:44
REPL で定義するとそうなる?> AbstractMethodError
lyrical logical
@lyricallogical
Mar 23 2016 07:44
んですかねえ。REPL の謎/・
Kazuhiro Sera
@seratch
Mar 23 2016 07:45
手元ではそうなりました。

initialCommands に

case class Foo(id: Long, name: String)
val foo = new SQLSyntaxSupport[Foo] {
  override def tableName = "foo"
  override def columns = Seq("id", "name")
}
val f2 = (new SQLSyntaxSupport[Foo] {
  override def tableName = "foo"
  override def columns = Seq("id", "name")
}).syntax

とか書いて REPL で foo.syntax や f2 を呼ぶのは問題ない。

lyrical logical
@lyricallogical
Mar 23 2016 07:46
REPL magic ですね
Kazuhiro Sera
@seratch
Mar 23 2016 07:46
SQLSyntaxSupport 初期化時に DB 繋ぎたくない場合は override lazy val columns とかで対応してもらう感じです。
Manabu Nakamura
@gakuzzzz
Mar 23 2016 07:48

findById の結果が Option[Company] でいいのなら object CompanyName つくらなくてもよさそう。

  def findById(id: Int)(implicit session: DBSession = AutoSession):Company = {
    withSQL {
     select.from(Company as c)
       .append(sqls" left join company_name CA on ca.company_id = ${c.id}")
       .where.eq(c.id, id)
    }.map { 
      // Do something.
    }.single.apply()
  }

みたいな。

lyrical logical
@lyricallogical
Mar 23 2016 08:38
sqlsyntax ぶち込めるのあったんだ・・・