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.
Я пробовал много разных вариантов, включая
Это работает, когда я извлекаю запись, но не свой собственный 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, но кажется, что это вполне возможно. Я убежден, что делаю что-то не так.
Вот пример запроса, который я пытаюсь выполнить, и POJO, который я пытаюсь заполнить. [code]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;
}
[/code] Отказ от ответственности: приведенный выше запрос упрощен до простых элементов, необходимых для иллюстрации проблемы. Реальный запрос должен выполнить второе боковое соединение, чтобы получить дополнительный список из другой таблицы и ссылаться на него в предложенииwhere. В приведенном выше примере это может быть что-то вроде SUBJECTS_TEACHER_MAPPING. Если кто-то собирается предложить совершенно другой метод, убедитесь, что он позволяет получать несколько списков, связанных с TEACHER, с соответствующими предложениямиwhere/and. Я пробовал много разных вариантов, включая [list] [*]передача Long[].class в DSL.field, т.е.[code]DSL.field("student.ids", Long[].class)[/code]
[*]Это работает, когда я извлекаю запись, но не свой собственный pojo
При загрузке в собственный pojo я получаю массив с одним нулевым значением внутри него
[*] Без класса Long[].Я получаю следующую ошибку: Причина: org.jooq.Exception.MappingException: произошла ошибка при сопоставлении записи с классом [Ljava.lang.Long;
[*]Использование DSL.jsonArrayAgg вместо DSL.arrayAgg в надежде, что преобразователь Джексона возьмет верх, как и в аналогичных случаях использования с использованием multiset. Результаты немного отличаются, но все равно не работают.
[*]Я попытался использовать мультимножество в предложении SELECT, и это сработало, но потом Я делаю один и тот же коррелированный подзапрос в SELECT и в JOIN, чтобы включить условиеwhere внизу
[*]Я пробовал несколько вариантов пользовательских конвертеров, но я не могу получить ни одного работает.
[*]Я попробовал получить запись, вызвав метод InMap(), а затем используя Джексона для записи в Pojo. Это работает, но расточительно.
[/list] Исходя из того, что я прочитал, ожидается, что более сложные классы Collection например Set, List напрямую не поддерживаются (это были мои первые попытки), за исключением случаев использования multiset из-за стирания типа. Это имеет смысл, но я удивлен, что не могу заставить Long[].class работать. Я перепробовал десятки вариантов. Часто я могу заставить данные заполниться в Long[], если я извлеку их из записи Jooq, но я никогда не смогу заставить их заполниться до моего определенного POJO. Я подумывал о том, чтобы сдаться и просто написать собственный конвертер записи в POJO, но кажется, что это вполне возможно. Я убежден, что делаю что-то не так.
Вот пример запроса, который я пытаюсь выполнить, и POJO, который я пытаюсь заполнить.
public Optional getTeachersWithStudentsForStudentId(long studentId) {
return ctx().select(
TEACHER.ID,
TEACHER.NAME,
DSL.field( students.student_ids ,...
В основном заголовок; Я наткнулся на код C++, который имел long long typedef LL; вместо того, что все ожидали, что-то вроде typedef long long LL;. Это волшебным образом сработало!
Я никогда не видел никакой документации по этому поводу и понятия...
Мне нужно вычислить некоторые значения в большом массиве. Я заметил, что следующие два фрагмента кода ведут себя по-разному с точки зрения корректности при использовании long long:
long long ans = n * n;
Я пытаюсь обновить jdk 8 до jdk 17 для нашего приложения. Я начал получать упомянутую здесь ошибку, исправив ее, добавив --add-exports= java.xml/jdk.xml.internal=ALL-UNNAMED в конфигурации виртуальной машины. После этого я получаю исключение типа...