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,然后去掉它。找了好久才找出原因。顾写下,希望为有需要的人以帮助
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值