我想创建输出聚合值的可自定义查询。我知道三种获取和执行查询的方法,但它们似乎都不够。我想要构建的查询如下所示:
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
类的记录但综合值(value),我不知道如何才能做到这一点。我开始从Mytable
中选择所以我想我需要将它用作Specification
的类型参数,但这立即意味着结果也应该是MyTable
类型,不是吗?
-
如何使用具有灵活结果类型的查询生成器?
最佳答案
您可以考虑使用 jOOQ,可以说,它可以为您提供尽可能多的灵 active ,同时将查询保持在“代码中”。
它可以从您的数据库模式生成 Java 类,您可以使用这些类通过其 DSL 形成查询。这是一个示例:https://github.com/benjamin-bader/droptools/blob/master/droptools-example/src/main/java/com/bendb/example/resources/PostsResource.java#L99
这是我上面链接的代码的主要内容:
final Record4<Integer, String, OffsetDateTime, String[]> record = create
.select(BLOG_POST.ID, BLOG_POST.BODY, BLOG_POST.CREATED_AT, arrayAgg(POST_TAG.TAG_NAME))
.from(BLOG_POST)
.leftOuterJoin(POST_TAG)
.on(BLOG_POST.ID.equal(POST_TAG.POST_ID))
.where(BLOG_POST.ID.equal(id.get()))
.groupBy(BLOG_POST.ID, BLOG_POST.BODY, BLOG_POST.CREATED_AT)
.fetchOne();
它看起来有点时髦,但它生成的内容如下:
SELECT blog_post.id, blog_post.body, blog_post.created_at, array_agg(post_tag.tags)
FROM blog_post
LEFT JOIN post_tag ON blog_post.id = post_tag.post_id
WHERE blog_post.id = ?
GROUP BY blog_post.id, blog_post.body, blog_post.created_at
您可以看到 Java 代码密切反射(reflect)了生成的 SQL,但由于 jOOQ 生成的代码,它仍然是完全类型安全的。因为它是代码,所以您可以根据需要动态构建查询。
这是一个严重的依赖项,但如果您的 SQL 需求是专门的或动态的,它可以为您做很多事情。
关于java - Spring boot jpa查询生成器的聚合值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56188304/