hibernate 方言org.hibernate.dialect.SQLServer2005Dialect导致字段分析不正确的有关问题
hibernate 方言org.hibernate.dialect.SQLServer2005Dialect导致字段分析不正确的问题
由于 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,然后去掉它。找了好久才找出原因。顾写下,希望为有需要的人以帮助