为了避免一遍又一遍地重新创建动态查询的同一部分,我打算一次构建主要部分,然后在应用程序的不同部分中重复使用这一部分。由于构建查询会涉及到一些问题(有关为什么会出现这种情况,请参阅问题jOOQ: best way to get aliased fields (from #as(alias, aliasFunction))),这应该会提高性能……
不幸的是,我不得不意识到构建器模式中的不同“步骤”不会返回修改后的副本,而是会修改基础状态。因此,我一直在寻找一种方法来创建特定“步骤”(例如SelectWhereStep
)的不可变副本,从中对其进行初始化,然后在每次需要时修改(选择)查询。不幸的是,我无法确定实现这一目标的任何(“合法”)方式。
可以做到吗?如果没有,最好的选择是什么?
答案 0 :(得分:0)
不幸的是,我不得不意识到构建器模式中的不同“步骤”不会返回修改后的副本,而是会修改基础状态
这确实是jOOQ DSL / model APIs当前设计中非常不幸的限制。 DSL API 应该是不可变的,而模型API是可变的。但这并不总是您所注意到的那样。
目前几乎没有办法克隆jOOQ查询,这实际上不是必需的。无论您使用的是可变的还是不可变的API,实现目标的最简洁的方法就是以一种有效的方式编写jOOQ查询。即代替
我将只构建一次主要部分,然后在应用程序的不同部分中重复使用这一部分
您可以以功能性方式而不是命令性方式执行相同的操作。不必为某些局部或全局变量分配“主要部分” ,您可以制作一个theMainPart()
函数来动态返回该部分。 More about this in this blog post。