我想创建输出聚合值的可定制查询。我知道三种获取和执行查询的方法,但似乎都不够。我要构建的查询如下所示:
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")...
- 优点:我们可以从查询中访问结果
- 缺点:它没有使用查询构建器:我们必须自己构建“选择...”字符串。
- 使用存储库
public interface MytableRepository extends CrudRepository<Mytable, Integer> { @Query("Select ...") public List<Object[]> findMinMaxPrice(@Param("myParam") String myParam);
- Pro:我们可以访问查询的结果。
- 缺点:查询是硬编码的
- 使用查询生成器
Specification<MyTable> spec = Specifications.<>where((mytable, query, cb) -> { Predicate sql = cb.equal(mytable.get("k"), "v"; return sql; } List<Mytable> result = myJpaSpecificationExecutor.findall(spec);
- Pro:它正在使用查询生成器
- 缺点:查询未使用 groupBy。由于我们的 groupBy 查询不是返回类记录
Mytable
而是聚合值,所以我不知道如何使这项工作。我开始选择 fromMytable
所以我认为我需要将它用作类型参数 toSpecification
,但这立即意味着结果也应该是 typeMyTable
,不是吗?
如何使用具有灵活结果类型的查询生成器?