Discussion:
eq() for Integer and Long
m***@gmail.com
2018-11-07 10:30:44 UTC
Permalink
Hi!
I work in Postgres. Let's say we have tables t1 with "int8" column
"longVal" and table t2 with "int4" column "intVal". In Postges
t1.longVal = t2.intVal
is possigle, but JOOQ requires casting
t1.LONGVAL.eq(t2.INTVAL.cast(SQLDataType.BIGINT))
otherwise it won't even compile.

t1.LONGVAL is TableField<t1Record, Long>
t2.INTVAL is TableField<t2Record, Integer>

Why JOOQ requires casting if SQL doesn't?

Is it possible to write this comparison without casting, so there would be
no CAST in generated SQL querry?
--
You received this message because you are subscribed to the Google Groups "jOOQ User Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email to jooq-user+***@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Lukas Eder
2018-11-07 11:16:03 UTC
Permalink
Hi there,

jOOQ is very opinionated in this area.

You may think that comparing ints and longs is still ok-ish. But what about
comparing Strings and ints? Or Strings and dates? Dates and booleans? Where
do you draw the line? And how would that be expressed using a generic API
in Java?

As this is not something that happens very often, jOOQ can safely assume
that by default, either you have a mistake in your schema, in case of which
you need to cast() (affects generated SQL) or coerce() (doesn't affect
generated SQL), or, more likely, in your query. So, this compilation error
is a very good thing in 99% of the cases.

Do note that even if your comparison makes sense in this particular case,
implicit type conversion in SQL is a can of worms in terms of performance.
It often prevents using appropriate indexes.

If you cannot fix your schema, you can use <forcedTypes/> in your code
generator to produce a BIGINT type for your INTVAL column.

I hope this helps
Lukas
Post by m***@gmail.com
Hi!
I work in Postgres. Let's say we have tables t1 with "int8" column
"longVal" and table t2 with "int4" column "intVal". In Postges
t1.longVal = t2.intVal
is possigle, but JOOQ requires casting
t1.LONGVAL.eq(t2.INTVAL.cast(SQLDataType.BIGINT))
otherwise it won't even compile.
t1.LONGVAL is TableField<t1Record, Long>
t2.INTVAL is TableField<t2Record, Integer>
Why JOOQ requires casting if SQL doesn't?
Is it possible to write this comparison without casting, so there would be
no CAST in generated SQL querry?
--
You received this message because you are subscribed to the Google Groups
"jOOQ User Group" group.
To unsubscribe from this group and stop receiving emails from it, send an
For more options, visit https://groups.google.com/d/optout.
--
You received this message because you are subscribed to the Google Groups "jOOQ User Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email to jooq-user+***@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Loading...