Hibernate中的方言

kan*_*arp 6 hibernate

Hibernate与数据库无关.因此,无论我们在应用程序中使用什么数据库,我们都需要设置与该数据库相关的方言.

例如,假设我们使用的是MySQL数据库,那么我们需要以下方言:org.hibernate.dialect.MySQLDialect

假设我们使用的是SQL Server数据库,那么我们需要以下方言:org.hibernate.dialect.SQLServerDialect

Hibernate将生成与该数据库相关的适当查询.我的问题是hibernate使用哪种机制来生成基于数据库的查询?

jpk*_*ing 9

不确定我理解你的问题,但我会尝试:-)

首先,一些东西在所有数据库中,而其他的东西都是具体的某些数据库(如"什么是当前的日期和时间?")的作品.对于在所有数据库中都有效的东西,没有什么特别的方言.

但对于可能与数据库不同的所有部分,Hibernate使用Dialect.Dialect是Hibernate以其语言与数据库通信的"帮手".例如,在某些时候,Hibernate代码需要知道JDBC类型"Types.TIMESTAMP"的数据库数据类型是什么.Hibernate的"核心"代码只是说"给我这个数据库相当于Types.TIMESTAMP的东西",而具体的Dialect就是答案.

SQL生成(或查询生成,如您所问)也是如此.Hibernate知道基本结构,但它也在Dialect中提供了一些钩子,以便特定的Dialect可以说"我不支持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