jOOQ:重用/复制查询 - java

为了避免一遍又一遍地重新创建动态查询的相同部分,我将构建一次主要部分,然后在应用程序的不同部分中重复使用该部分。由于构建查询有些涉及(请参阅问题jOOQ: best way to get aliased fields (from #as(alias, aliasFunction)),了解为什么如此),这应该会提高性能……

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

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

参考方案

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

这确实是jOOQ DSL / model APIs当前设计中非常不幸的限制。 DSL API应该是不变的,而模型API是可变的。但这并不总是您所注意到的那样。

目前,没有办法像大多数情况下那样克隆jOOQ查询,这实际上不是必需的。无论您使用的是可变的还是不可变的API,实现您想要做的最干净的方法就是以一种功能化的方式编写jOOQ查询。即代替

我将只构建一次主要部分,然后在应用程序的不同部分中重复使用这一部分

您可以以功能性方式而不是命令性方式执行相同的操作。您可以制作一个theMainPart()函数以动态返回该部分,而不是将“主要部分”分配给某些局部或全局变量。 More about this in this blog post。

As a side-note, when writing dynamic SQL, there are usually better ways than referencing the XYZStep types directly。

SQL Joins与Java代码? - java

我有这样的查询Select Folder.name from FROM FolderTable,ValidFolder, ValidFolderGroup, ValidUser, ValidLocation, ValidDepartment where ValidUser.LocationCode *= ValidLocation.LocationCode …

Jooq如何基于复合键查询实体 - java

如何在Jooq中基于组合键查询实体?例如。:UserAttempts org.jooq.impl.DAOImpl.findById(Record2<UInteger, String> id) id是复合键。如何使用Record2<UInteger, String>? 参考方案 您可以使用Record2构造DSLContext.newR…

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…