在 quarkus 上使用 panache 执行自定义 JPQL 查询

Posted

技术标签:

【中文标题】在 quarkus 上使用 panache 执行自定义 JPQL 查询【英文标题】:execute custom JPQL query with panache on quarkus 【发布时间】:2021-11-26 13:30:55 【问题描述】:

我们在 quarkus/graphql 应用程序中使用 panache 来访问数据库。它可以很好地过滤和获取数据。现在我们想执行自定义 jqpl 查询,但是我们没有找到一种方法来使用 panache 和活动记录模式。

为什么这对我们来说是必要的?我们想使用 timescaledb,它是 PostgreSQL 的一个扩展。而要获取聚合数据,我们需要在数据库级别使用它的函数。

为什么不使用 sql 查询?我们的 graphql 接口基于我们的 java 代码中的字段名称。编写 sql 查询需要我们在用于某些 graphql 查询的过滤器中使用列名。

有没有办法用华丽的方式执行自定义 jqpl 查询?

亲切的问候, 马尔科

【问题讨论】:

【参考方案1】:

您在寻找自定义查询吗?

@Query(
  value = "SELECT time_bucket(...), avg(temperature) FROM conditions", 
  nativeQuery = true)
Collection<ConditionSummary> dailyTemperatureSummary();

我认为这是一个很好的检查资源:https://www.baeldung.com/spring-data-jpa-query

我从来没有使用过华丽的东西,但是我在从 Hasura 层获取 GQL 时遇到了一些类似的难题,因为我的查询中缺少应该注册为表的类型。

长话短说,我创建了一些空表结构来映射我的函数中返回一组行的相同类型。

关于此特定部分的注意事项: https://docs.timescale.com/timescaledb/latest/tutorials/custom-timescaledb-dashboards/#building-views-for-our-timescaledb-metrics

看:

CREATE TABLE compressed_chunk AS
SELECT compress_chunk((c.chunk_schema ||'.' ||c.chunk_name)::regclass)
FROM   timescaledb_information.chunks c
WHERE  NOT c.is_compressed limit 0;

这只是我正在做的一个技巧,让我可以声明这个函数:

CREATE OR REPLACE FUNCTION compress_chunk_named(varchar) returns setof compressed_chunk AS ...

因此,它允许 Hasura 了解我的函数返回一组可管理的 &lt;table&gt; 结果。也许您可以以类似的方式处理您的查询。

【讨论】:

您好乔纳,感谢您的回答。我们没有使用 spring 或 spring-data,因为我们正在使用 quarkus。但我会看看你为映射创建空表的建议。也许这有助于解决我们的问题。 嗨,Marko,我正在调查,也许这个问题是相关的:github.com/quarkusio/quarkus/issues/5348 还有很好的资源:@​​987654324@ 您好 Jona,抱歉回复晚了。项目中的优先级发生了变化,我们不再对此进行处理。谢谢你的链接。我认为他们的方向是正确的。

以上是关于在 quarkus 上使用 panache 执行自定义 JPQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

使用 Debezium 的 Quarkus 发件箱模式:如何将自定义列添加到发件箱表

quarkus依赖注入之七:生命周期回调

quarkus依赖注入之七:生命周期回调

如何在 Quarkus 中使用自定义编码器和解码器?

不与特定表关联的实体的命名查询

使用 Panache 选择字符串包含子字符串的位置