2016-10-16 2 views
1

ich den folgenden Typen in meiner PostgreSQL-Datenbank habe:Seltsame Übersetzung von jOOQ Abfrage für Array enthält Funktion

myoptions text[] 

Ich benutze einen jOOQ Konverter so, dass ich ein Set als entsprechender Typ in meiner Platte habe:

Set<String> myoptions 

in meiner Anfrage ich habe folgende Bedingung:

c.MYOPTIONS.contains(Sets.newHashSet("option1")) 

, die in SQL übersetzt wie folgt:

cast("c"."myoptions" as varchar) like ('%' || '[option1]' || '%') escape '!' 

Ist es das normale Verhalten?

würde Ich mag wie etwas haben:

c.myoptions @> ARRAY['option1'] 

oder

'option1' = ANY(c.myoptions) 

Vielen Dank im Voraus für Ihre Hilfe

Antwort

0

jOOQ zur Zeit (ab Version 3.8) nicht Ihre benutzerdefinierten erkennen Da der Datentyp immer noch ein Array-Datentyp in PostgreSQL ist, tritt das Standardverhalten Field.contains() auf - dh dasjenige, das alle Werte als Strings behandelt.

Ich habe feature request #5602 dafür erstellt. Als Abhilfe können, müssen Sie Ihre eigene mit plain SQL rollen:

public static <T, C extends Collection<T>> Condition contains(
    Field<? extends C> left, 
    C right 
) { 
    return DSL.condition("{0} @> {1}::text[]", left, DSL.val(right, left.getDataType())); 
} 

... die Sie dann als solche verwendet werden können:

contains(c.MYOPTIONS, Sets.newHashSet("option1")) 
+0

Danke für Ihre Hilfe. Könnten Sie mir bitte sagen, wie Sie Ihre statische Funktion verwenden können? – Manu

+0

@Manu: Sicher, ich habe meine Antwort bearbeitet –

+0

Danke aber die 2 Typen scheint nicht kompatibel zu sein, ich habe den folgenden Fehler jetzt: Wrong 1. Argument Typ. Gefunden: 'org.jooq.TableField >', benötigt: 'org.jooq.Field ' – Manu

0

Bitte versuchen Sie folgende Lösung. Arbeitete in meinem Fall.

select.where(ARRAY_FIELD.contains(DSL.cast(DSL.array(VALUE), ARRAY_FIELD.getDataType())));