Как я могу выбрать поле 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("students.student_ids", STUDENT_TEACHER_MAPPING.STUDENT_ID.getDataType().getArrayType()))
.from(TEACHER)
.leftJoin(DSL.lateral(
DSL.select(DSL.arrayAgg(STUDENT_TEACHER_MAPPING.STUDENT_ID).as("student_ids"))
.from(STUDENT_TEACHER_MAPPING)
.where(STUDENT_TEACHER_MAPPING.TEACHER_ID.eq(TEACHER.ID))).as("students"))
.on(DSL.condition(true))
.limit(1)
.fetchOptionalInto(TeacherWithStudents.class);

}

// TeacherWithStudents class

@Data
@AllArgsConstructor
public class TeacherWithStudents {

long id;
String name;
Long[] studentIds;

}

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

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

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

    Я получаю следующую ошибку: Причина: org.jooq.Exception.MappingException: произошла ошибка при сопоставлении записи с классом [Ljava.lang.Long;< /p>
  • Использование DSL.jsonArrayAgg вместо DSL.arrayAgg в надежде, что преобразователь Джексона возьмет верх, как это происходит в аналогичных случаях использования с использованием multiset. В этом случае я получаю массив с одним нулевым значением, т.е. [null]
  • Я попытался использовать мультимножество в предложении SELECT, которое работает, но затем я делаю один и тот же коррелированный подзапрос в SELECT и в JOIN, чтобы включить условиеwhere внизу
  • Я попробовал несколько вариантов пользовательских конвертеров, но не могу заставить его работать.
  • Я попытался получить запись, вызвав метод InMap(), а затем используя Джексона для напиши поджо. Это работает, но расточительно.
Исходя из того, что я прочитал, ожидается, что более сложные классы 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»