是否可以在jOOQ中检查包装类型的别名字段?类似于field.getWrapped() instanceof AggregateFunction
。
另外,我发现课程FieldAlias
不公开,所以甚至无法检查field instanceof FieldAlias
。让这个课不公开的动机是什么?
答案 0 :(得分:3)
是否可以在jOOQ中检查包装类型的别名字段?像field.getWrapped()instanceof AggregateFunction。
目前无法通过公共jOOQ API获取字段别名,因为别名就像使用jOOQ QueryPart
类型的任何其他表达式一样都是内部API。
这种检查有一个低优先级待处理功能请求:https://github.com/jOOQ/jOOQ/issues/2579
功能请求尚未描述精心设计的功能,因此我目前不相信它会很快添加到API中。
您可以通过实现VisitListener
SPI来解决此限制,它允许您实现为SQL呈现逻辑访问的每个QueryPart
调用的回调。使用堆栈计算机similar to the one described in this article,您可以检查别名表达式包含的表达式。可以触发VisitListener
,例如致电DSLContext.render(QueryPart)
。
事实上,能够在不需要呈现SQL字符串或收集绑定变量的情况下触发VisitListener
SPI会很有趣。我为此创建了一个功能请求:
https://github.com/jOOQ/jOOQ/issues/6735
但无论如何,对于你的真实用例来说,这可能有点过分,不幸的是,我还不知道你的问题。
让这个课程不公开的动机是什么?
简单:它是内部API。没有理由为什么任何人都应该访问内部API,内部API随时都会发生变化,包括在补丁发布之间。
少数人在jOOQ user group关于jOOQ内部包被私有和/或final
的一些投诉。这些投诉主要是由一些短期目标推动的,例如您建议的instanceof
支票,其选择的动机尚未披露。讨论功能请求的真正动机几乎总是更好,这可能转化为每个人都可以使用的一个很棒的新功能,而不是讨论打开内部API的一小部分来覆盖的可能性。这种重写类似于简单地修补原始源代码并自己构建fork。它可能在短期内起作用,但对于社区和图书馆本身来说,它不是一个好的解决方案,因为它只会从向后兼容的角度增加维护压力,而不会增加任何一般的价值。
从这个意义上讲,通过将库包装设为私有来关闭库内部是一个非常好的主意。同样,您无权访问Java 8的Stream
实现类,因为您不应该具有此类访问权限。
此处有关此API设计动机的更多详细信息: https://blog.jooq.org/2017/03/20/the-open-closed-principle-is-often-not-what-you-think-it-is/