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>
Это работает, когда я извлекаю запись, но не свой собственный 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, но кажется, что это вполне возможно. Я убежден, что делаю что-то не так.
Вот пример запроса, который я пытаюсь выполнить, и POJO, который я пытаюсь заполнить. [code]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;
}
[/code] Отказ от ответственности: приведенный выше запрос упрощен до простых элементов, необходимых для иллюстрации проблемы. Реальный запрос объединяется с дополнительными таблицами и ссылается на эти таблицы в предложенииwhere. Если кто-то собирается предложить совершенно другой метод, убедитесь, что он позволяет получать несколько массивов идентификаторов, связанных с TEACHER, с соответствующими предложениямиwhere/and. Я пробовал много разных вариантов, включая< /p> [list] [*]передача Long[].class в DSL.field, т.е.[code]DSL.field("student.ids", Long[].class)[/code]
[*]Это работает, когда я извлекаю запись, но не свой собственный pojo
Я получаю следующую ошибку: Причина: org.jooq.Exception.MappingException: произошла ошибка при сопоставлении записи с классом [Ljava.lang.Long;< /p>
[*]Использование DSL.jsonArrayAgg вместо DSL.arrayAgg в надежде, что преобразователь Джексона возьмет верх, как это происходит в аналогичных случаях использования с использованием multiset. В этом случае я получаю массив с одним нулевым значением, т.е. [null]
[*]Я попытался использовать мультимножество в предложении SELECT, которое работает, но затем я делаю один и тот же коррелированный подзапрос в SELECT и в JOIN, чтобы включить условиеwhere внизу
[*] Я попробовал несколько вариантов пользовательских конвертеров, но не могу заставить его работать.
[*]Я попытался получить запись, вызвав метод InMap(), а затем используя Джексона для напиши поджо. Это работает, но расточительно.
[/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( student.ids ))
.from(TEACHER)...
В основном заголовок; Я наткнулся на код 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 в конфигурации виртуальной машины. После этого я получаю исключение типа...