Как сделать динамическую проекцию, включая связанные ряды в JOOQJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как сделать динамическую проекцию, включая связанные ряды в JOOQ

Сообщение Anonymous »

Контекст: я строю HTTP API, обертывающую нормализованную схему базы данных. Уровень доступа к базе данных использует JOOQ. Для большинства запросов у меня нет проблем. Проблема начинается с этого типа доступа к чтению: < /p>

Код: Выделить всё

GET /foo/123
GET /foo/123?include=bars&include=baz
< /code>
, где Foo, Bar и Baz являются типами ресурсов в модели, каждый из которых представлен таблицей. Foo Might Have Baz, и Foo Has Many Bar, так что это то, на что может выглядеть ресурс Foo, когда все включено: < /p>
{"id": 123,
"fooname": "the foo",
"and more": "foo fields",
"baz_id": 456,
"baz": {"id": 456, "and more": "baz fields"},
"bars": [{"id": 789, "foo_id": 123, "and more": "bar fields"},
{...}]}
Пользователь также может установить параметр «Включить на что -то другое или полностью его опустить», в этом случае поля Baz и bars будут опущены из представления ресурса Foo. Если отношения запрошены, но нет соответствующих строк, ожидается, что поля присутствуют в ответе, но с нулевым или пустым значением массива. Рэнглинг Джексона, так что это делает это правильно, это немного боли, но выполнимо. Подумайте о уровне управления graphQL над представлением (очевидно, не так много), но по разным причинам, не используя graphql. < /P>
Теперь, чтобы построить jooq Query: < /p>

Код: Выделить всё

// I will also have to build the Page version of this for returning multiple Foos,
// with the same kind of issues. note not using the generated FooRecord because we
// do not need all the fields in the response
Foo foo = this.dsl.select(
some, foo, fields,
include.contains("baz") ? BAZ_INCLUDE : null,
include.contains("bars") ? BARS_INCLUDE : null)
.from(FOOS)
.where(FOOS.ID.equal(fooId))
.fetchSingle(Records.mapping(Foo::new));
где Foo - это запись Java (некоторые, Foo, Fields, @nullable Baz, @nullable list ) . Это должно быть такой динамичным; Некоторые типы ресурсов имеют 5 или 6 из этих дополнительных отношений, иногда между многоуровневыми соединениями.

Код: Выделить всё

// we're actually using the Foo table's Bar and Baz relations here since they carry
// the information about the relationship, and will cause an implicit join, which
// saves some work when building the query. e.g. FOO.bar().ID
// Foo has 0 or 1 Baz
private static SelectField BAZ_INCLUDE = row(some, baz, fields)
.mapping(Baz::new)
.as("baz");
// Foo has 0 to N Bars
private static SelectField BARS_INCLUDE = multiset(select(some, bar, fields))
.convertFrom(r -> r.map(Records.mapping(Bar::new))
.as("bars");
< /code>
И чудесным образом, это работает! ... при использовании полной проекции (include={baz,bars}
). Когда одно или несколько отношений не соблюдается, я получаю время выполнения ClassCastException, поскольку JOOQ не любит NULLS в избранных, по -видимому: Class org.jooq.impl.recordimpl3 нельзя поднять в класс org.jooq.record5 (3 - это артистика, когда включает в себя пуст, 5, когда он полный, а также и также. /> Я также пытался include.contains ("baz")? Baz_include: inline (null, baz_include.getdatatype ()) , но я получаю org.jooq.exception.datatypeexception: функция преобразования не реализована. Я чувствую, что должен быть способ преодолеть этот один (картирование нуля с java null должно быть простым?), Но я вроде как потерял в функциях преобразования. < /P>
Как я могу сделать динамические проекции между соединениями и все еще получаю характеристики хорошего типа, так что я разумно уверен, что я не забыл полю в записи Foo или в выборе? Из последних вещей мне нужно достичь паритета функции с нашим существующим инструментом Hibernate+QueryDsl+EntityGraph (а также улучшить некоторые вещи над этим!).


Подробнее здесь: https://stackoverflow.com/questions/797 ... ws-in-jooq
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»