由于 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,然后去掉它。找了好久才找出原因。顾写下,希望为有需要的人以帮助