Java jooq嵌套选择和类型安全
我正在尝试用jooq编写以下sql: 选择SUM`SUM`作为`total` 从…起 选择 MIN`num_视图`AS`sum` 来自“事实”愿望列表` 按`id分组` AS t 我发现了一些与此相关的东西: 嵌套表= tablecreate.selectMYTABLE.ID, minMYTABLE.NUM_视图 .asviews .从我的表格 .groupByMYTABLE.ID; 返回create.selectsumField nested.fieldview .fromnested .fetchOne.value1.longValue;Java jooq嵌套选择和类型安全,java,sql,jooq,Java,Sql,Jooq,我正在尝试用jooq编写以下sql: 选择SUM`SUM`作为`total` 从…起 选择 MIN`num_视图`AS`sum` 来自“事实”愿望列表` 按`id分组` AS t 我发现了一些与此相关的东西: 嵌套表= tablecreate.selectMYTABLE.ID, minMYTABLE.NUM_视图 .asviews .从我的表格 .groupByMYTABLE.ID; 返回create.selectsumField nested.fieldview .fromnested .fe
然而,不知何故,我已经失去了类型安全。我觉得我做错了什么,但我看不出来。关于如何改进这一点有什么想法吗?不幸的是,在jOOQ中使用派生表无法实现100%的类型安全性,因为Java编译器无法真正证明派生表包含列。但是,通过重用视图字段,您的使用肯定会得到改进。只需将其分配给一个局部变量 字段视图=minMYTABLE.NUM_views.asviews; 嵌套表= tablecreate.selectMYTABLE.ID,最小视图 .从我的表格 .groupByMYTABLE.ID; 返回create.selectsumnested.FieldView .fromnested .fetchOne.value1.longValue; 请注意,该方法如何允许维护类型引用,前提是您传入的字段确实存在于派生表中(使用其给定名称),并且它与参数字段的类型匹配 使用窗口函数的替代方法 请注意,您的查询可以使用以下方法重写
SELECT SUM(MIN(num_views)) OVER ()
FROM fact_wishlist
GROUP BY id
LIMIT 1
或在jOOQ中:
回来
create.selectsumminMYTABLE.NUM\u VIEWS.over
.从我的表格
.groupByMYTABLE.ID
.limitinline1
.单身
.价值1.长期价值;
这当然取决于您的数据库是否支持窗口功能,它可能比双聚合解决方案快/慢,也取决于供应商。谢谢,回答得很好。过度版本适合我,虽然我觉得它不那么直观,但它肯定更简洁,所以我同意这一点: