由于 org.hibernate.dialect.SQLServerDialect 方言中的分页不是真分页
所以用了org.hibernate.dialect.SQLServer2005Dialect作为方言
但是之后出现一个郁闷的问题。我的一个表里面有一个字段名称是distinct_code,因为某程序员设计表的时候,把单词写错了,本来应该是district_code的。写错的结果就是,hibernate查询的时候直接把distinct去掉,把code作为字段才查询。
查看了org.hibernate.dialect.SQLServer2005Dialect的源码
public class SQLServer2005Dialect extends SQLServerDialect
{
public SQLServer2005Dialect()
{
registerColumnType(2004, "varbinary(MAX)");
registerColumnType(-3, "varbinary(MAX)");
registerColumnType(-3, 8000L, "varbinary($l)");
registerColumnType(-4, "varbinary(MAX)");
registerColumnType(2005, "varchar(MAX)");
registerColumnType(-1, "varchar(MAX)");
registerColumnType(12, "varchar(MAX)");
registerColumnType(12, 8000L, "varchar($l)");
registerColumnType(-5, "bigint");
registerColumnType(-7, "bit");
registerColumnType(16, "bit");
registerFunction("row_number", new NoArgSQLFunction("row_number", StandardBasicTypes.INTEGER, true));
}
public boolean supportsLimitOffset()
{
return true;
}
public boolean bindLimitParametersFirst()
{
return false;
}
public boolean supportsVariableLimit()
{
return true;
}
public int convertToFirstRowValue(int zeroBasedFirstResult)
{
return zeroBasedFirstResult + 1;
}
public String getLimitString(String query, int offset, int limit)
{
if(offset > 1 || limit > 1)
return getLimitString(query, true);
else
return query;
}
public String getLimitString(String querySqlString, boolean hasOffset)
{
StringBuilder sb = new StringBuilder(querySqlString.trim().toLowerCase());
int orderByIndex = sb.indexOf("order by");
CharSequence orderby = ((CharSequence) (orderByIndex <= 0 ? "ORDER BY CURRENT_TIMESTAMP" : sb.subSequence(orderByIndex, sb.length())));
if(orderByIndex > 0)
sb.delete(orderByIndex, orderByIndex + orderby.length());
replaceDistinctWithGroupBy(sb);
insertRowNumberFunction(sb, orderby);
sb.insert(0, "WITH query AS (").append(") SELECT * FROM query ");
sb.append("WHERE __hibernate_row_nr__ >= ? AND __hibernate_row_nr__ < ?");
return sb.toString();
}
protected static void replaceDistinctWithGroupBy(StringBuilder sql)
{
int distinctIndex = sql.indexOf("distinct");
int selectEndIndex = sql.indexOf("from");
if(distinctIndex > 0 && distinctIndex < selectEndIndex)
{
sql.delete(distinctIndex, distinctIndex + "distinct".length() + 1);
sql.append(" group by").append(getSelectFieldsWithoutAliases(sql));
}
}
protected static CharSequence getSelectFieldsWithoutAliases(StringBuilder sql)
{
String select = sql.substring(sql.indexOf("select") + "select".length(), sql.indexOf("from"));
return stripAliases(select);
}
protected static String stripAliases(String str)
{
Matcher matcher = ALIAS_PATTERN.matcher(str);
return matcher.replaceAll("$1");
}
protected void insertRowNumberFunction(StringBuilder sql, CharSequence orderby)
{
int selectEndIndex = sql.indexOf("from");
sql.insert(selectEndIndex - 1, (new StringBuilder()).append(", ROW_NUMBER() OVER (").append(orderby).append(") as __hibernate_row_nr__").toString());
}
private static final String SELECT = "select";
private static final String FROM = "from";
private static final String DISTINCT = "distinct";
private static final int MAX_LENGTH = 8000;
private static final Pattern ALIAS_PATTERN = Pattern.compile("\\sas\\s[^,]+(,?)");
}
/*
DECOMPILATION REPORT
Decompiled from: D:\dgdoc\worksp_newasj\cxjs\src\main\webapp\WEB-INF\lib\hibernate-core-4.1.2.jar
Total time: 25 ms
Jad reported messages/errors:
Exit status: 0
Caught exceptions:
*/
发现里面判断关键字distinct,然后去掉它。找了好久才找出原因。顾写下,希望为有需要的人以帮助
分享到:
相关推荐
DatabaseName=test"),用户名("sa"),密码("518168"),驱动类("com.microsoft.sqlserver.jdbc.SQLServerDriver"),以及方言("org.hibernate.dialect.SQLServerDialect")。方言用于使Hibernate能够生成适应...
【国产达梦数据库系统简介】 达梦数据库管理系统(DM,DamoDB)是中国自主研发的一款高性能、高可用性的关系型数据库管理系统。...在实际项目中,一定要注意选择正确的方言,以避免因语法不兼容导致的问题。
- **`hibernate.dialect`**:指定数据库方言,对于SQL Server,该值通常为`org.hibernate.dialect.SQLServerDialect`。 - **`mapping`**:指定Hibernate映射文件的位置,例如`<mapping resource="com/hibernate/User...
- `dialect`: 配置了特定数据库的方言,例如`org.hibernate.dialect.SQLServerDialect`。 - `myeclipse.connection.profile`: 可能是MyEclipse IDE中的数据库配置文件名。 - `connection.password`: 指定数据库...
-- <property name="connection.url">jdbc:microsoft:sqlserver://localhost:1433;SelectMethod=cursor;DatabaseName=pubs <property name="connection.driver_class">...
<property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect ``` - 可以通过设置`hibernate.show_sql`为`true`来显示Hibernate生成的SQL语句,便于调试。同时,`hibernate.hbm2ddl.auto`属性...
<property name="hibernate.dialect">org.hibernate.dialect.MySQL57Dialect <!-- HBM2DDL 自动处理数据库模式 --> <property name="hibernate.hbm2ddl.auto">update <!-- 是否显示SQL语句 --> ...
- `dialect` 属性定义了方言,这里是 `org.hibernate.dialect.SQLServerDialect`,用于处理 SQL Server 特有的语法。 - `show_sql` 设置为 `true`,会在控制台打印出执行的 SQL 语句,便于调试。 - `mapping` ...
这里,`hibernate.connection.*`属性用于设置数据库连接信息,`hibernate.dialect`定义了数据库方言,便于Hibernate生成对应的SQL语句。`hibernate.hbm2ddl.auto`控制了数据库表的自动创建或更新,如设为`update`,...
- **方言设置**:Dialect的选择决定了Hibernate如何生成特定于目标数据库的SQL语句,例如MySQL、Oracle或SQL Server等。 - **映射文件**:`Configuration`类负责加载实体映射文件,这些文件描述了Java对象与数据库...
2. **方言设置**:指定使用的SQL方言,如`<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>`,适应不同的数据库系统。 3. **会话工厂配置**:如`<property name="hibernate....
- **dialect**: 指定了Hibernate使用的方言,它告诉Hibernate如何处理特定数据库的SQL语法差异。 - **MySQL**: `org.hibernate.dialect.MySQLDialect` - **Oracle**: `org.hibernate.dialect.Oracle9Dialect` - *...
同时,由于Mycat提供了自己的SQL解析和执行机制,因此在Hibernate的`hibernate.dialect`属性中,应选择与Mycat兼容的方言,如`org.hibernate.dialect.MySQL5InnoDBDialect`。 接下来,创建实体类并进行映射。在...
- **net.sf.hibernate.dialect.***:数据库方言实现,用于处理不同数据库特有的特性。 - **net.sf.hibernate.eg.***:示例类。 - **net.sf.hibernate.engine.***:核心引擎相关的API。 - **...
<property name="dialect">org.hibernate.dialect.Oracle9Dialect ... <mapping resource="com/yourpackage/Demo.hbm.xml"/> <mapping resource="com/yourpackage/Image.hbm.xml"/> ... </hibernate-...
- **配置示例**: 例如,在配置文件中可以指定`org.hibernate.dialect.MySQL5InnoDBDialect`,表示使用MySQL的InnoDB引擎相关的SQL方言。 #### 四、Hibernate控制下的POJO呈现的三种状态 - **4.1 transient(暂态)...
8. 支持的数据库:Hibernate支持多种数据库,如MySQL、Oracle、PostgreSQL、SQL Server等,通过不同的数据库方言(Dialect)实现与特定数据库的兼容。 9. 批量操作:Hibernate提供了批处理功能,如`batch_size`属性...
- 设置方言(`dialect`),例如`MySQL5Dialect`,以适应特定数据库的SQL语法。 - 启用SQL日志输出(`show_sql`),便于调试。 - 设置`hbm2ddl.auto`属性,如“create”用于在每次启动应用时创建新的数据库表结构...
Nhibernate支持多种数据库,包括SQL Server 2000,通过设置配置文件中的dialect参数可以指定。 在提供的压缩包中,你可能找到一个已经配置好的Nhibernate项目,包括实体类、映射文件、配置文件、以及可能的示例查询...