Не уверен, что понял ваш вопрос, но я попробую :-)
Сначала есть некоторые вещи, которые работают во всех базах данных, в то время как другие вещи специфичны для некоторых баз данных(например, «какова текущая дата и время?»).Для вещей, которые работают во всех базах данных, нет ничего действительно специфического для диалектов.
Но для всех частей, которые могут отличаться от базы данных к другой, Hibernate использует диалект.Диалект является «помощником» для Hibernate для связи с базой данных на ее языке.Например, в какой-то момент код Hibernate должен знать, какой тип данных базы данных для типа JDBC "Types.TIMESTAMP".«Базовый» код Hibernate просто говорит «дай мне все, что эквивалентно этой базе данных Types.TIMESTAMP», и конкретный диалект отвечает на это.
То же самое происходит для генерации SQL (или генерации запросов, как вы и просили).Hibernate знает базовую структуру, но также предоставляет некоторые хуки в диалекте, так что конкретный диалект может сказать «я не поддерживаю функцию X» или «для функции Y использовать строку« abc »в запросе».
Конечно, мой ответ - предельное упрощение всего процесса.Я рекомендую прочитать код для Dialect.java и, например, MySQLDialect.java.Таким образом, вы можете иметь представление о том, как Hibernate структурирует (и даже как он потребляет) часть этой информации:
https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java
https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/dialect/MySQLDialect.java