私は、当社が高度に構成可能なデータベース検索サービスを持っている立場にいます。このサービスでは、プログラムでクエリを構成することが非常に便利です。Criteria API は強力ですが、開発者の 1 人がデータ オブジェクトの 1 つをリファクタリングすると、ユニット テストを実行するか、さらに悪いことに、実際の運用環境でテストを実行するまで、基準の制限は違反していることを示しません。最近、リファクタリング プロジェクトの作業時間が予想外に 2 倍になりました。これは、プロジェクト計画のギャップであり、実際にどれくらいの時間がかかるかを知っていれば、おそらく別のアプローチをとっていたでしょう。
この問題を解決するために Example API を使用したいと思います。Java コンパイラーは、実際の POJO プロパティで「where」条件を指定している場合、クエリが失敗したことを大声で示すことができます。ただし、サンプル API には非常に多くの機能しかなく、多くの点で制限があります。次の例を見てください
Product product = new Product();
product.setName("P%");
Example prdExample = Example.create(product);
prdExample.excludeProperty("price");
prdExample.enableLike();
prdExample.ignoreCase();
ここでは、プロパティ「name」に対してクエリが実行されています (「P%」などの名前)。フィールド「name」を削除または名前変更すると、すぐにわかります。しかし、物件の「価格」はどうでしょうか。Product オブジェクトにはデフォルト値があるため除外されているため、「price」プロパティ名を除外フィルターに渡しています。「価格」が削除された場合、このクエリは構文的に無効になり、実行時までわかりません。ラメ。
もう 1 つの問題 - 2 つ目の where 句を追加するとどうなるでしょうか。
product.setPromo("Discounts up to 10%");
enableLike() の呼び出しにより、この例はプロモーション テキスト「最大 10% の割引」だけでなく、「最大 10,000,000 ドルの割引」またはその他の一致するテキストにも一致します。一般に、 enableLike() や ignoreCase() などの Example オブジェクトのクエリ全体の変更は、チェック対象のすべてのプロパティに常に適用できるとは限りません。
これが 3 番目の主要な問題です。他の特別な基準についてはどうでしょうか。標準のサンプル フレームワークを使用して、価格が 10 ドルを超えるすべての製品を入手する方法はありません。結果をプロモーションで降順に並べ替える方法はありません。製品オブジェクトが一部の製造元に結合されている場合、関連する製造元オブジェクトに基準を追加する方法もありません。製造元の基準で FetchMode を安全に指定する方法もありません (ただし、これは一般的に Criteria API の問題です - 無効なフェッチされた関係は黙って失敗し、時限爆弾のようになります)
上記のすべての例では、Criteria API に戻って、プロパティの文字列表現を使用してクエリを作成する必要があります。これも、サンプル クエリの最大のメリットを排除しています。
必要なコンパイル時のアドバイスを得ることができるサンプル API に代わるものは何ですか?