jOOQ:重用/复制查询

Chr*_*ris 7 java sql performance builder jooq

为了避免一遍又一遍地重新创建动态查询的同一部分,我将构建一次主要部分,然后在应用程序的不同部分重用这部分。由于构建查询有点涉及(请参阅问题jOOQ: best way to get aliased fields (from #as(alias, aliasFunction))的一个方面),这应该有利于性能...

不幸的是,我不得不意识到构建器模式中的不同“步骤”不会返回修改后的副本,而是修改底层状态。因此,我一直在寻找一种方法来创建特定“步骤”(例如SelectWhereStep)的不可变副本,每次我需要时从该副本初始化并随后修改(Select-)查询。不幸的是,我无法确定实现这一目标的任何(“合法”)方式。

可以做到吗?如果没有,最好的选择是什么?

Luk*_*der 7

不幸的是,我不得不意识到构建器模式中的不同“步骤”不返回修改后的副本,而是修改底层状态

这确实是jOOQ DSL/模型 API当前设计中的一个非常不幸的限制。DSL API应该是不可变的,而模型 API 是可变的。但正如您所注意到的,情况并非总是如此。

目前没有办法像大多数人那样克隆 jOOQ 查询,这并不是真正必要的。无论您使用的是可变 API 还是不可变 API,实现您想要做的事情的最简洁方法是以函数方式组合 jOOQ 查询。即代替

我打算构建一次主要部分,然后在应用程序的不同部分重用这部分

你可以用函数式的方式而不是命令式的方式来做同样的事情。您可以创建一个动态返回该部分的函数,而不是将“主要部分”分配给某个局部或全局变量theMainPart()在这篇博文中详细介绍了这一点

作为旁注,在编写动态 SQL 时,通常有比XYZStep直接引用类型更好的方法