動的に生成する検索条件について

383 views
Skip to first unread message

Yoichiro Manabe

unread,
Jun 16, 2013, 6:36:34 AM6/16/13
to scalikejdbc-users-group-ja(日本語)
みなさま

真鍋と申します。初めて投稿します。

個人的に作成しているアプ��ケーションなどでscalikejdbcを利用させていただいております。

最近 anorm で作成されたモデルの処理について scalikejdbc へ移行しているのですが、動的に検索条件(where句)を生成する
場合に、名前付き SQL テンプレートでbindByNameの引数にどのようにパラメータを渡せばよいかで悩んでおります。

引数をmapで作成してもtupleへ変換できず、tupleを動的に生成することもできない状況です。

動的なSQLの条件句を生成する場合の対応方法として何かよい方法はないでしょうか。

なお、使用している環境ですが、

Scala 2.10.1 -- play 2.1 - scalikejdbc 1.6

を使用しています。

以上、よろしくお願いいたします。

Kazuhiro Sera

unread,
Jun 16, 2013, 10:05:13 AM6/16/13
to scalikejdbc-u...@googlegroups.com
はじめまして。瀬良 @seratch です。

この辺の issue が同じようなことをやっているので参考になるかと思います。SQL("...") であれば文字列連結することになります。

https://github.com/seratch/scalikejdbc/issues/85
https://github.com/seratch/scalikejdbc/issues/120

> tupleを動的に生成

こちらについては以下の params のような Seq を条件に基づいて作り #bindByName(params:_*) に渡せば実現できると思います。

val params: Seq[(Symbol, Any)] = Seq('id -> 1, 'name -> "Typesafe")
SQL("select * from company where id = {id} and name = {name}")
.bindByName(params:_*)
.map(_.toMap).list.apply()


ただし、SQL("...") はとっつきやすい一方で、このように入力によってクエリを動的に組み立てる場合は SQL
インジェクションの危険性が高まる傾向があります。

Scala 2.10 環境なのであれば SQLInterpolation、Query DSL を使うことを強くお勧めします。

SQLInterporlation の場合だと #120 の私のレスにあるようなのを書くことになるので、一番おすすめなのは Query
DSL で #map や #dynamicAndConditions を使うことです。

https://github.com/seratch/scalikejdbc/blob/1.6.3/scalikejdbc-interpolation/src/test/scala/scalikejdbc/QueryInterfaceSpec.scala#L126
https://github.com/seratch/scalikejdbc/blob/1.6.3/scalikejdbc-interpolation/src/test/scala/scalikejdbc/QueryInterfaceSpec.scala#L140-L143

ご不明な点などあればお気軽にお尋ねください。

2013/6/16 Yoichiro Manabe <uky...@gmail.com>:
> --
> このメールは Google グループのグループ「scalikejdbc-users-group-ja(日本語)」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、scalikejdbc-users-g...@googlegroups.com にメールを送信します。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>
>

真鍋 洋一郎

unread,
Jun 16, 2013, 11:01:15 AM6/16/13
to scalikejdbc-u...@googlegroups.com
瀬良さん

はじめまして。真鍋です。

すごく速くご回答いただけて感謝&驚いております。

今回は教えていただきましたtupleを動的に生成する方法で試してみたいと思います。

本来であれば、ご指摘いただいているようなSQL InterpolationやQuery DSLなどを使用したいと思うのですが、
不勉強なこととanormからの移行を優先しているためまだ使用できていません。が、落ち着いたらさらに移行したい
と思っています。

(.NETを生業としていたので、Linqライクな感じでとても興味を持っています。)

また、githubのwikiは参照していたのですがissueまで見ていませんでした。同じような事例がありそうなので今後は
確認したいと思います。

※scalikejdbcは英語・日本語のドキュメントが豊富なのでとても感謝しております。

ご回答ありがとうございました。今後ともよろしくお願いします。
-----------------------------------------------
真鍋 洋一郎(Yoichiro Manabe)
mail:uky0426@gmail.com
Skype/Twitter:you_manabe
Reply all
Reply to author
Forward
0 new messages