Deprecation notice
After encountering numerous problems building the jOOQ-refaster module in various JDK versions and after receiving no feedback from the community about this feature, we have decided to remove it again in jOOQ 3.15: https://github.com/jOOQ/jOOQ/issues/10803
Starting with jOOQ 3.13, we’re offering a new module called jOOQ Refaster
, which provides refaster templates for automatic API migration.
What’s Refaster?
Refaster is a lesser known sub project of the popular Google Error Prone library, a library for static code analysis, implemented as a Java compiler plugin. We already support a few such static code analysis tools through the jOOQ Checker
module, which can be used with both the Checker Framework and with Google’s Error Prone.
Refaster allows for finding “bad” API usage patterns in your code, and produce .patch
files automatically, which fix such patterns, producing better code.
What are we offering in jOOQ?
Over the years, we have deprecated quite a bit of API, as new API came along. For example, there is the ResultQuery.fetchLazy(int)
method, where the int
parameter corresponds to the JDBC fetchSize
that is being passed along to JDBC.
Long ago, we introduced better API for passing the fetchSize
. You can:
- Specify a
Settings
value with your configuration for a globalfetchSize
to apply - Specify
ResultQuery.fetchSize(int)
, which can then be combined withfetchLazy()
, or with any type offetch()
call, as this isn’t really specific to “lazy” fetching
The Javadoc says:
Deprecated. [#2811] – 3.3.0 – Use fetchSize(int) and fetchLazy() instead.
…and your IDE will probably warn you about deprecated API usage, but who has time to fix all these warnings and read all these Javadoc?
Instead, you can now download the refaster file for your jOOQ version from our website https://www.jooq.org/refaster, configure your Java compiler to include ErrorProne’s refaster library (as documented in the jOOQ manual), and get a patch right away.
For example, if your code reads:
public void runQuery() { try (Cursor<?> cursor = ctx.select(T.A) .from(T) .fetchLazy(42)) { // Do something } }
You might be getting a patch file like this one:
--- ..\..\src\main\java\org\jooq\refaster\test\RefasterTests.java +++ ..\..\src\main\java\org\jooq\refaster\test\RefasterTests.java @@ -62,6 +62,5 @@ public void runQuery() { try (Cursor<?> cursor = ctx.select(T.A) - .from(T) - .fetchLazy(42)) { + .from(T).fetchSize(42).fetchLazy()) { // Do something }
And you’ll get the improved version of your code automatically:
public void runQuery() { try (Cursor<?> cursor = ctx.select(T.A) .from(T).fetchSize(42).fetchLazy()) { // Do something } }
In our opinion, all libraries should offer such refaster files (or another technology doing something similar) to help users upgrade more easily between versions.
What’s next?
In addition to upgrading deprecated API usage (which is a very obvious use-case for Refaster), we’re also experimenting with some other static code analysis and improvement approaches that deal with our understanding of the SQL language, and best practices. For example, as we’ve blogged before, it is not recommended to use COUNT(*)
queries in SQL (or in any language), when a simple EXISTS()
check would suffice.
jOOQ 3.13 already offers an introspection that replaces calls like these:
ctx.fetchCount(table) != 0 ctx.fetchCount(table) >= 1 // And many more
By equivalent, but likely much more performant expressions:
ctx.fetchExists(table)
So, stay tuned for more such goodies in the future!