2

スカラクエリを使用して SQLite データベースのテキスト列の長さを取得しようとすると、間違った SQL が生成されます。私はこれを得る:

SELECT "t1"."title" FROM "GoodPages" "t1" WHERE ({fn length("t1"."title")} > 65)

クエリが実際にあるべきとき

SELECT "t1"."title" FROM "GoodPages" "t1" WHERE length("t1"."title") > 65

このforクエリを取得するために使用するコンプは

for (f <- Foo if f.title.length > 65) yield f.title

そして、私が持っているテーブル定義は

object Foo extends Table[(Int,String)]("Foo") {
  def id = column[Int]("id")
  def title = column[String]("title")
  def * = id ~ title
}

scalaquery が間違ったlength()関数を生成しているように見えますが、コードのどこでこれが発生したかを見つけることができず、インターネット上でこれについて何かを見つけたこともありません。

4

1 に答える 1

1

表示される生成された SQL は、 JDBC エスケープ構文、より正確には fn キーワードの JDBC エスケープ構文を使用します。この構文は JDBC ドライバーで使用できますが、残念ながら SQLite ドライバーではサポートされていません。

Slick 1.0.0 は、次のスニペットがSQLiteDriver示唆するように、これを認識しています。

case Apply(j: Library.JdbcFunction, ch) if j != Library.Concat =>
  /* The SQLite JDBC driver does not support ODBC {fn ...} escapes, so we try
   * unescaped function calls by default */
  b"${j.name}("
  b.sep(ch, ",")(expr(_, true))
  b")"
case s: SimpleFunction if s.scalar =>
  /* The SQLite JDBC driver does not support ODBC {fn ...} escapes, so we try
   * unescaped function calls by default */
  b"${s.name}("
  b.sep(s.nodeChildren, ",")(expr(_, true))
  b")"

Slick 1.0.0 が機能しない場合は、おそらく別の解決策を見つけることができます。お知らせ下さい。

于 2013-02-23T19:25:14.263 に答える