RESTリソースを提供するHibernateバックエンドを備えたJavaWebアプリがあります。現在、getリクエストのクエリパラメータによって制御される汎用検索を実装するという課題に直面しています。
some/rest/resource?name_like=foo&created_on>=2012-09-12&sort_by_asc=something
または類似。
- 考えられるすべてのパラメーター(name、created_on、something)を事前に定義する必要はありません。
- 制御文字(> =など)を取得するために要求文字列を分析する必要はありません
- また、_eq _like _goeなどを反映するために独自の文法を実装する必要もありません(制御文字の代替または追加として)
GETリクエストパラメータからデータベースクエリへのこのマッピングに役立つフレームワークはありますか?
取得しているRESTリソースがわかっているので、エンティティ/テーブル(選択)があります。検索の深さを制限するために、実行されるJOINを事前に定義することもおそらく必要になります。
ただし、それ以外は、RESTを消費するクライアントが、特定のパラメーターと特定の制御シーケンスが検索に変換される方法を事前に定義しなくても、検索を実行できるようにする必要があります。
現在、MysemasQueryDSL上に構築された半自動ソリューションを試しています。これにより、where列と並べ替え列を事前に定義でき、パラメーター内の「_like」、「_ loe」、...などを検出して、検索の対応する事前定義された部分をアクティブ化するための単純な文字列比較に取り組んでいます。型保存のSQLインジェクションプルーフであることを除いて、SQL文字列と大差ありません。
ただし、「「???」のような名前の人を探す」というクエリを処理できる可能性があることを検索オブジェクトに伝える必要があります。現時点では、RESTリソースを内部でのみ消費し、実際の検索の作成を非常にうまく分離しているため、これは問題ありません。検索をさらに実行する必要がある場合は、今のところ事前定義を追加するだけです。しかし、将来、RESTリソースを公開する必要がありますが、それはそれほど素晴らしいことではありません。
したがって、これに取り組むには、フレームワーク、ベストプラクティス、または推奨されるソリューションが必要です。これを望んでいるのは私たちが最初ではありません。たとえば、RedmineはRESTインターフェースを介してすべてのリソースを提供し、自由にクエリを実行できます。または、そのGraphAPIを使用してFacebookを使用します。それらの人たちは、すべての可能性を事前に定義しただけでなく、一般的な文法を作成したと確信しています。その労力を可能な限り節約し、代わりに利用可能なソリューションを使用したいと思います。
私が言ったように、私たちはHibernateを使用しているので、SQLまたはHQLソリューションは問題ないか、QueryDslのようなエンティティに基づいて構築されます。(SQLインジェクションに関するセキュリティの問題もあります)
助言がありますか?アイデア?私たちはそれをすべて自分たちでやらなければならないのでしょうか?