gpt4 book ai didi

java - jooq 嵌套选择和类型安全

转载 作者:行者123 更新时间:2023-11-30 10:02:49 28 4
gpt4 key购买 nike

我正在尝试在 jooq 中编写以下 sql:

SELECT SUM(`sum`) AS `total`
FROM(
SELECT
MIN(`num_views`) AS `sum`
FROM `fact_wishlist`
GROUP BY `id`
) AS t

我发现了一些适用于此的东西:

Table<Record2<String, Integer>> nested = 
table(create.select(MYTABLE.ID,
min(MYTABLE.NUM_VIEWS)
.as("views"))
.from(MYTABLE)
.groupBy(MYTABLE.ID));

return create.select(sum((Field<Integer>) nested.field("views")))
.from(nested)
.fetchOne().value1().longValue();

但是,不知何故我失去了类型安全。我觉得我在做一些明显错误的事情,但我没有看到。关于如何改进这方面的任何想法?

最佳答案

不幸的是,您无法在 jOOQ 中使用派生表实现 100% 的类型安全,因为 Java 编译器无法真正证明派生表包含列。但是通过重用 "views" 绝对可以提高您的使用率 field 。只需将其分配给局部变量即可。

Field<Integer> views = min(MYTABLE.NUM_VIEWS).as("views");

Table<Record2<String, Integer>> nested =
table(create.select(MYTABLE.ID, min(views))
.from(MYTABLE)
.groupBy(MYTABLE.ID));

return create.select(sum(nested.field(views)))
.from(nested)
.fetchOne().value1().longValue();

注意 Table.field(Field<T>) 方法允许维护 <T>类型引用假设您传入的字段确实存在于派生表中,按其给定的名称,并且它与您的参数字段的类型相匹配。

使用窗口函数的替代方法

请注意,您的查询可以使用 window functions 重写如下。

SELECT SUM(MIN(num_views)) OVER ()
FROM fact_wishlist
GROUP BY id
LIMIT 1

或者在 jOOQ 中:

return
create.select(sum(min(MYTABLE.NUM_VIEWS)).over())
.from(MYTABLE)
.groupBy(MYTABLE.ID)
.limit(inline(1))
.fetchSingle()
.value1().longValue();

这当然取决于您的数据库是否支持窗口函数,它可能比您的双聚合解决方案更快/更慢,这也取决于供应商。

关于java - jooq 嵌套选择和类型安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56583876/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com