diff --git a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/types/Hstore.java b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/types/Hstore.java
index 9805a3300a..daa6561304 100644
--- a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/types/Hstore.java
+++ b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/types/Hstore.java
@@ -42,6 +42,7 @@ import java.util.HashMap;
import java.util.Map;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
/**
* A data type representing the PostgreSQL hstore type.
@@ -80,6 +81,15 @@ public final class Hstore implements Serializable {
return new Hstore(data);
}
+ /**
+ * Create a new {@link Hstore} instance from string data input, or
+ * null if the input is null.
+ */
+ @Nullable
+ public static final Hstore hstoreOrNull(Map data) {
+ return data == null ? null : new Hstore(data);
+ }
+
@Override
public int hashCode() {
return data.hashCode();
diff --git a/jOOQ/src/main/java/org/jooq/JSON.java b/jOOQ/src/main/java/org/jooq/JSON.java
index bff78c240d..89d2da2aba 100644
--- a/jOOQ/src/main/java/org/jooq/JSON.java
+++ b/jOOQ/src/main/java/org/jooq/JSON.java
@@ -40,6 +40,7 @@ package org.jooq;
import java.io.Serializable;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
/**
* A JSON wrapper type for JSON data obtained from the database.
@@ -83,6 +84,15 @@ public final class JSON implements Serializable {
return new JSON(data);
}
+ /**
+ * Create a new {@link JSON} instance from string data input, or
+ * null if the input is null.
+ */
+ @Nullable
+ public static final JSON jsonOrNull(String data) {
+ return data == null ? null : json(data);
+ }
+
@Override
public int hashCode() {
return data.hashCode();
diff --git a/jOOQ/src/main/java/org/jooq/JSONB.java b/jOOQ/src/main/java/org/jooq/JSONB.java
index e654cedd6b..d298e4d789 100644
--- a/jOOQ/src/main/java/org/jooq/JSONB.java
+++ b/jOOQ/src/main/java/org/jooq/JSONB.java
@@ -40,6 +40,7 @@ package org.jooq;
import java.io.Serializable;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
/**
* A JSON wrapper type for JSONB data obtained from the database.
@@ -83,6 +84,15 @@ public final class JSONB implements Serializable {
return new JSONB(data);
}
+ /**
+ * Create a new {@link JSONB} instance from string data input, or
+ * null if the input is null.
+ */
+ @Nullable
+ public static final JSONB jsonbOrNull(String data) {
+ return data == null ? null : jsonb(data);
+ }
+
@Override
public int hashCode() {
return data.hashCode();
diff --git a/jOOQ/src/main/java/org/jooq/XML.java b/jOOQ/src/main/java/org/jooq/XML.java
index 3479671a61..96cf1d04e2 100644
--- a/jOOQ/src/main/java/org/jooq/XML.java
+++ b/jOOQ/src/main/java/org/jooq/XML.java
@@ -40,6 +40,7 @@ package org.jooq;
import java.io.Serializable;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
/**
* An XML wrapper type for XML data obtained from the database.
@@ -83,6 +84,15 @@ public final class XML implements Serializable {
return new XML(data);
}
+ /**
+ * Create a new {@link XML} instance from string data input, or
+ * null if the input is null.
+ */
+ @Nullable
+ public static final XML xmlOrNull(String data) {
+ return data == null ? null : xml(data);
+ }
+
@Override
public int hashCode() {
return data.hashCode();
diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractXMLBinding.java b/jOOQ/src/main/java/org/jooq/impl/AbstractXMLBinding.java
new file mode 100644
index 0000000000..239a7657e5
--- /dev/null
+++ b/jOOQ/src/main/java/org/jooq/impl/AbstractXMLBinding.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Other licenses:
+ * -----------------------------------------------------------------------------
+ * Commercial licenses for this work are available. These replace the above
+ * ASL 2.0 and offer limited warranties, support, maintenance, and commercial
+ * database integrations.
+ *
+ * For more information, please visit: http://www.jooq.org/licenses
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ */
+package org.jooq.impl;
+
+import static org.jooq.XML.xml;
+import static org.jooq.XML.xmlOrNull;
+import static org.jooq.tools.Convert.convert;
+
+import java.sql.SQLException;
+import java.sql.Types;
+
+import org.jooq.Binding;
+import org.jooq.BindingGetResultSetContext;
+import org.jooq.BindingGetSQLInputContext;
+import org.jooq.BindingGetStatementContext;
+import org.jooq.BindingRegisterContext;
+import org.jooq.BindingSQLContext;
+import org.jooq.BindingSetSQLOutputContext;
+import org.jooq.BindingSetStatementContext;
+import org.jooq.XML;
+
+/**
+ * @author Lukas Eder
+ */
+abstract class AbstractXMLBinding implements Binding {
+
+ /**
+ * Generated UID
+ */
+ private static final long serialVersionUID = -2153155338260706262L;
+
+ @Override
+ public final void sql(BindingSQLContext ctx) throws SQLException {
+ ctx.render().visit(DSL.val(ctx.convert(converter()).value()));
+ }
+
+ @Override
+ public final void register(BindingRegisterContext ctx) throws SQLException {
+ ctx.statement().registerOutParameter(ctx.index(), Types.VARCHAR);
+ }
+
+ @Override
+ public final void set(BindingSetStatementContext ctx) throws SQLException {
+ ctx.statement().setString(ctx.index(), convert(ctx.convert(converter()).value(), String.class));
+ }
+
+ @Override
+ public final void get(BindingGetResultSetContext ctx) throws SQLException {
+ ctx.convert(converter()).value(xmlOrNull(ctx.resultSet().getString(ctx.index())));
+ }
+
+ @Override
+ public final void get(BindingGetStatementContext ctx) throws SQLException {
+ ctx.convert(converter()).value(xmlOrNull(ctx.statement().getString(ctx.index())));
+ }
+
+ @Override
+ public final void set(BindingSetSQLOutputContext ctx) throws SQLException {
+ ctx.output().writeString(convert(ctx.convert(converter()).value(), String.class));
+ }
+
+ @Override
+ public final void get(BindingGetSQLInputContext ctx) throws SQLException {
+ ctx.convert(converter()).value(xmlOrNull(ctx.input().readString()));
+ }
+}
diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractXMLasObjectBinding.java b/jOOQ/src/main/java/org/jooq/impl/AbstractXMLasObjectBinding.java
index 1f5d86db7e..56e7cc558a 100644
--- a/jOOQ/src/main/java/org/jooq/impl/AbstractXMLasObjectBinding.java
+++ b/jOOQ/src/main/java/org/jooq/impl/AbstractXMLasObjectBinding.java
@@ -56,6 +56,7 @@ import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.namespace.QName;
import org.jooq.Converter;
+import org.jooq.XML;
/**
* A binding that binds JAXB-annotated {@link Object} types to {@link SQLXML}
@@ -65,7 +66,7 @@ import org.jooq.Converter;
*
* @author Lukas Eder
*/
-public class AbstractXMLasObjectBinding extends AbstractVarcharBinding {
+public class AbstractXMLasObjectBinding extends AbstractXMLBinding {
/**
@@ -73,18 +74,18 @@ public class AbstractXMLasObjectBinding extends AbstractVarcharBinding {
*/
private static final long serialVersionUID = -2153155338260706262L;
- private final Converter