I've been trying to use postgis with jooq and have run into a problem when 
attempting to use postgis functions. I've defined a converter and binder 
for the "geometry" data type and it appears to work fine in queries that 
don't use postgis functions. 

For example, for the following table:
CREATE TABLE example (
 id BIGSERIAL PRIMARY KEY,
 location GEOGRAPHY(POINT, 4326) NOT NULL
);

queries like these work fine: (dbSessionManager is just a thin wrapper 
around DSLContext)

fun createExample(location: Location): ExampleRecord {
 return dbSessionManager.session()
 .insertInto(EXAMPLE)
 .set(EXAMPLE.LOCATION, location.convertToPoint())
 .returning()
 .fetchOne()
}

or

fun getExampleByLocation(location: Location): ExampleRecord? {
 return dbSessionManager.session()
 .selectFrom(EXAMPLE)
 .where(EXAMPLE.LOCATION.eq(location.convertToPoint()))
 .limit(1)
 .fetchOne()
}


But this query 
fun getExampleInRadius(location: Location, radius: Double):ExampleRecord? {
 val routine = StDwithin3()
 routine.set__1(EXAMPLE.LOCATION)
 routine.set__2(location.convertToPoint())
 routine.set__3(radius)
 return dbSessionManager.session()
 .selectFrom(EXAMPLE)
 .where(routine.asField())
 .limit(1)
 .fetchOne()
}
fails with the following error: 

org.jooq.exception.DataAccessException: SQL [select "public"."example"."id", 
"public"."example"."location" from "public"."example" where "postgis".
"st_dwithin"(cast("public"."example"."location" as USER-DEFINED), 
cast(?::geography 
as USER-DEFINED), cast(? as double precision)) limit ?]; ERROR: syntax 
error at or near "USER"

because for some reason jooq is trying to cast the location to 
"USER-DEFINED" instead of geography. It appears that 
`AbstractRoutine.pgArgNeedsCasting` forces all parameters of overloaded 
functions to be cast, but I'm not sure why its being cast to "USER-DEFINED" 
instead of "geography". Maybe I've set up the converter/binder wrong, but 
its very close to what was recommended here: 
https://groups.google.com/forum/#!topic/jooq-user/TBQZCPTCvnk

In the interest of making this easier to debug, I've put together a very 
stripped down version of my codebase that still exhibits this behavior. If 
you feel like taking a look, it is here: 
https://github.com/amc6/jooq_postgis_bug_example

The key files are:

   - db/migration/V2__add_postgis.sql 
   
<https://github.com/amc6/jooq_postgis_bug_example/blob/master/database/migrations/src/main/resources/db/migration/V2__add_postgis.sql>
   - Contains the example table definitions and postgis extension 
      installation.
      - The one non-standard thing I am doing here is installing postgis 
      into a separate schema, but that does not appear to affect the presence 
of 
      this bug.
   - com/sharespace/database/PostGisGeographyBinding.java 
   
<https://github.com/amc6/jooq_postgis_bug_example/blob/master/database/jooq/src/main/java/com/sharespace/database/PostGisGeographyBinding.java>
   - Contains the Binding and Converter. Very similar to what was suggested 
      in https://groups.google.com/forum/#!topic/jooq-user/TBQZCPTCvnk.
   - com/sharespace/persistence/Persister.kt 
   
<https://github.com/amc6/jooq_postgis_bug_example/blob/master/server/src/main/kotlin/com/sharespace/persistence/Persister.kt>
   - com/sharespace/persistence/PersisterTest.kt 
   
<https://github.com/amc6/jooq_postgis_bug_example/blob/master/server/src/test/kotlin/com/sharespace/persistence/PersisterTest.kt>
   - Contains a few tests to show exactly what works and what does not. In 
      particular, use the function ST_DWithin using jooq does not work, but 
using 
      ST_DWithin as raw sql does work.
   - There are a few other miscellaneous files that are probably 
   unnecessary for such a small project, but are leftover from me paring down 
   a full project/repo. I'm fairly confident that this bug isn't a result of 
   them.

Any insight would be greatly appreciated!

Best,
Adam

-- 
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+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to