集計値を出力するカスタマイズ可能なクエリを作成したいと考えています。クエリを取得して実行する 3 つの方法を知っていますが、どれも十分ではないようです。作成したいクエリは次のようになります。
Select max(category), min(price) as minprice from mytable where k='v' group by category
tldr: 1 と 2 をスキップします。
- 文字列としての SQL
private NamedParameterJdbcTemplate template; template.query("select ..." , new MapSqlParameterSource("...", "...") , rs -> {...rs.getString("minprice")...
- 長所: クエリから結果にアクセスできます
- 短所: クエリ ビルダーを使用していません。"select..." 文字列を自分で作成する必要があります。
- リポジトリの使用
public interface MytableRepository extends CrudRepository<Mytable, Integer> { @Query("Select ...") public List<Object[]> findMinMaxPrice(@Param("myParam") String myParam);
- 長所: クエリから結果にアクセスできます。
- 短所: クエリがハードコーディングされている
- クエリ ビルダーの使用
Specification<MyTable> spec = Specifications.<>where((mytable, query, cb) -> { Predicate sql = cb.equal(mytable.get("k"), "v"; return sql; } List<Mytable> result = myJpaSpecificationExecutor.findall(spec);
- 長所:クエリビルダーを使用しています
- 短所: クエリは groupBy を使用していません。groupBy クエリはクラスのレコードでは
Mytable
なく集計値を返すため、これを機能させる方法がわかりません。から選択を開始するMytable
ので、それを型パラメーター to として使用する必要があると思いますがSpecification
、それはすぐに結果も型MyTable
にする必要があることを意味しますね。
柔軟な結果タイプでクエリビルダーを使用するにはどうすればよいですか?