Как я могу выбрать поле Long[] в своем pojo из бокового соединения с помощью arrayAgg()?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу выбрать поле Long[] в своем pojo из бокового соединения с помощью arrayAgg()?

Сообщение Anonymous »

Вот пример запроса, который я пытаюсь выполнить, и POJO, который я пытаюсь заполнить.

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

public Optional getTeachersWithStudentsForStudentId(long studentId) {
return ctx().select(TEACHER.ID, TEACHER.NAME, DSL.field("student.ids"))
.from(TEACHER)
.leftJoin(DSL.lateral(
DSL.select(DSL.arrayAgg(STUDENT_TEACHER_MAPPING.STUDENT_ID).as("ids"))
.from(STUDENT_TEACHER_MAPPING)
.where(STUDENT_TEACHER_MAPPING.TEACHER_ID).eq(TEACHER.ID)))
.as("student")).on(DSL.condition(true))
.where(DSL.field("student.ids").contains(studentId))
.fetchOptionalInto(TeacherWithStudents.class);

}

// TeacherWithStudents class

@Data
@AllArgsConstructor
public class TeacherWithStudents {

long id;
String name;
Long[] studentIds;

}

Отказ от ответственности: приведенный выше запрос упрощен до простых элементов, необходимых для иллюстрации проблемы. Реальный запрос должен выполнить второе боковое соединение, чтобы получить дополнительный список из другой таблицы и ссылаться на него в предложенииwhere. В приведенном выше примере это может быть что-то вроде SUBJECTS_TEACHER_MAPPING. Если кто-то собирается предложить совершенно другой метод, убедитесь, что он позволяет получать несколько списков, связанных с TEACHER, с соответствующими предложениямиwhere/and.
Я пробовал много разных вариантов, включая
  • передача Long[].class в DSL.field, т.е.

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

    DSL.field("student.ids", Long[].class)
  • Это работает, когда я извлекаю запись, но не свой собственный pojo

    При загрузке в собственный pojo я получаю массив с одним нулевым значением внутри него
  • Без класса Long[].Я получаю следующую ошибку: Причина: org.jooq.Exception.MappingException: произошла ошибка при сопоставлении записи с классом [Ljava.lang.Long;
  • Использование DSL.jsonArrayAgg вместо DSL.arrayAgg в надежде, что преобразователь Джексона возьмет верх, как и в аналогичных случаях использования с использованием multiset. Результаты немного отличаются, но все равно не работают.
  • Я попытался использовать мультимножество в предложении SELECT, и это сработало, но потом Я делаю один и тот же коррелированный подзапрос в SELECT и в JOIN, чтобы включить условиеwhere внизу
  • Я пробовал несколько вариантов пользовательских конвертеров, но я не могу получить ни одного работает.
  • Я попробовал получить запись, вызвав метод InMap(), а затем используя Джексона для записи в Pojo. Это работает, но расточительно.
Исходя из того, что я прочитал, ожидается, что более сложные классы Collection например Set, List напрямую не поддерживаются (это были мои первые попытки), за исключением случаев использования multiset из-за стирания типа. Это имеет смысл, но я удивлен, что не могу заставить Long[].class работать. Я перепробовал десятки вариантов. Часто я могу заставить данные заполниться в Long[], если я извлеку их из записи Jooq, но я никогда не смогу заставить их заполниться до моего определенного POJO. Я подумывал о том, чтобы сдаться и просто написать собственный конвертер записи в POJO, но кажется, что это вполне возможно. Я убежден, что делаю что-то не так.

Подробнее здесь: https://stackoverflow.com/questions/792 ... g-arrayagg
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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