2012-03-19 8 views
3

"Computers"サンプルのようなリストページを作成しようとしています。私の環境では、私は私のユーザーオブジェクトの以下のメソッドを持っている2.0とPostrgreSQL 9.0PostgreSQL 9.0で異常終了しました。

を再生する次のとおりです。

def list(page: Int = 0, pageSize: Int = 10, orderBy: Int = 1, filter: String = "%"): Page[User] = { 
    val offset = pageSize * page 
    val mode = if (orderBy > 0) "ASC NULLS FIRST" else "DESC NULLS LAST" 

    Logger.debug("Users.list with params: page[%d] pageSize[%d] orderBy[%d] filter[%s] order[%s]".format(page, pageSize, orderBy, filter, mode)) 

    DB.withConnection { 
     implicit connection => 

     val users = SQL(
      """ 
      select * from publisher 
      where name ilike {filter} 
      order by {orderBy} %s 
      limit {pageSize} offset {offset} 
      """.format(mode) 
     ).on(
      'pageSize -> pageSize, 
      'offset -> offset, 
      'filter -> filter, 
      'orderBy -> scala.math.abs(orderBy) 
     ).as(User.simple *) 

     val totalRows = SQL(
      """ 
      select count(*) from publisher 
      where name like {filter} 
      """ 
     ).on(
      'filter -> filter 
     ).as(scalar[Long].single) 

     Page(users, page, offset, totalRows) 
    } 

    } 

は私が提供している「ORDERBY」の値は関係ありません、順序は常にのIDに基づいていますエンティティ。

Anormによって生成されたクエリは有効なPostgreSQLであり、データベースに対して直接実行するとうまく動作します。しかし、Anormパーサが結果が返される順序を無視していて、代わりに 'id'でリストされたリストを返すように思えます。

私はさらに"select * from publisher order by 2 ASC/DESC"へのクエリを単純化しようとしましたが、何も修正されていません。返された順番は無視されます。

この問題を解決する方法についてのご意見はありますか?

答えて

4

PlayのメーリングリストにあるGuillaumeのおかげで、回避策が見つかりました。

すべてのプレースホルダーは、で並べ替えられたものを除いてすべて動作します。悪い点は、ログに従うとドライバが正しいクエリを生成し、PostgreSQLがそれを受け取っていることです。私は何が取引なのか分かりませんが、非常に混乱しますが、そのプレースホルダを削除すればうまくいきます。

val users = SQL(
    """ 
    select * from publisher 
    where name ilike {filter} 
    order by %d %s 
    limit {pageSize} offset {offset} 
    """.format(scala.math.abs(orderBy), mode) 
).on(
    'pageSize -> pageSize, 
    'offset -> offset, 
    'filter -> filter 
).as(User.simple *) 

は今、あなたは、「SQLインジェクション」を叫ぶことでしょうリラックス、それは何とか可能かもしれないが、orderByは整数である(これは:。。私はこのようにそれを解決:(

を押す

orderByに文字列を指定したコントローラを呼び出すと、Playは404エラーを返します。したがって、整数だけが許されます。また、指定された整数に対応する列がない場合、order byだから、理想的ではないが、それほど悪くはない。

関連する問題