#java #postgresql #jooq
#java #postgresql #jooq
Вопрос:
Статические функции DSL для row()
, похоже, не используют диалект, используемый в DSLContext .
Я использую postgres с jooq для запроса моей базы данных. У меня есть связующее для использования с объектами типа java InetAddress
, которые я успешно использую в других частях моего приложения. Диалект правильно настроен на postgres при использовании контекстного DSL (DSLContext).
Однако, если я попытаюсь использовать статические функции из DSL
класса, используется диалект ПО УМОЛЧАНИЮ, и мой связующий файл не используется.
В частности, мой проблемный запрос, о котором идет речь, выглядит следующим образом:
final var existingLinkRecords = asSeq(create
.selectFrom(l)
.where(row(l.FROM_IP, l.TO_IP).in(links.map(link -> row(link.from().ip(), link.to().ip())).asJava()))
.fetch());
Предыдущий код приводит к следующему исключению:
org.jooq.exception.SQLDialectNotSupportedException: Type class java.net.Inet6Address is not supported in dialect DEFAULT
at org.jooq.impl.DefaultDataType.getDataType(DefaultDataType.java:884)
at org.jooq.impl.DefaultDataType.getDataType(DefaultDataType.java:823)
at org.jooq.impl.DSL.getDataType(DSL.java:21760)
at org.jooq.impl.DSL.val(DSL.java:19522)
at org.jooq.impl.Tools.field(Tools.java:1209)
at org.jooq.impl.DSL.row(DSL.java:20152)
...
Корень проблемы, по-видимому, заключается в этой функции из DSL:
@Deprecated
@Support
public static <T> DataType<T> getDataType(Class<T> type) {
return DefaultDataType.getDataType(SQLDialect.DEFAULT, type);
}
Я не смог найти никакого способа создания RowN()
объектов, кроме использования класса DSL.
Есть ли какой-нибудь способ решить эту проблему?
Комментарии:
1. Это звучит ужасно похоже на github.com/jOOQ/jOOQ/issues/8197 , который был исправлен в jOOQ 3.11.10. Какую версию jOOQ вы используете?
2. спасибо @LukasEder за ваш ответ. я использую 3.11.7, но я только что попробовал его с 3.11.11 и столкнулся с той же проблемой. я думаю, проблема в том, что
T
значения, которые я передаю,DSL.row(T, T)
являются noFields
или другими специфичными для jooq классами, но голыми типами Inet6Address, поэтомуDSL.row(T, T)
функция не может получить контекст. есть ли способ получить контекстно-зависимую версиюDSL
, которая может создаватьRow
объекты? или есть какой-либо другой способ сделатьwhere (a, b) in (('x', 'y'), ('z', 'n'))
, где x, y, z, n неFields
являются значениями? 🙂3. Я вижу, вы правы. Однако вам все равно придется обновляться 🙂
4. подойдет 🙂 большое спасибо за вашу помощь!
Ответ №1:
Проблема возникает из-за вашего вызова
row(link.from().ip(), link.to().ip())
Поскольку DSL.row()
это статический метод, jOOQ 3.11 в настоящее время не может «угадать», какова соответствующая привязка типа данных для ваших пользовательских типов, отсюда и исключение.
В качестве обходного пути существуют различные способы привязки типа данных к вашему выражению строки. Поскольку вы уже прикрепили его к своим row(l.FROM_IP, l.TO_IP)
столбцам, вы можете использовать их повторно, используя DSL.val(Object, Field)
row(val(link.from().ip(), l.FROM_IP), val(link.to().ip(), l.TO_IP))
Вероятно, в вашем случае это должно работать из коробки. Я создал запрос функции для этого: https://github.com/jOOQ/jOOQ/issues/8517
Комментарии:
1. спасибо, этот метод работает и делает именно то, что я хотел!