读书人

hibernate 方言org.hibernate.dialect

发布时间: 2012-12-20 09:53:21 作者: rapoo

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 REPORTDecompiled from: D:\dgdoc\worksp_newasj\cxjs\src\main\webapp\WEB-INF\lib\hibernate-core-4.1.2.jarTotal time: 25 msJad reported messages/errors:Exit status: 0Caught exceptions:*/
?发现里面判断关键字distinct,然后去掉它。找了好久才找出原因。顾写下,希望为有需要的人以帮助

读书人网 >SQL Server

热点推荐