`
美味人间
  • 浏览: 91441 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

相关推荐

    使用hibernate对sqlserver 2005进行增删改查

    DatabaseName=test"),用户名("sa"),密码("518168"),驱动类("com.microsoft.sqlserver.jdbc.SQLServerDriver"),以及方言("org.hibernate.dialect.SQLServerDialect")。方言用于使Hibernate能够生成适应...

    国产达梦dialect方言jar包.rar

    【国产达梦数据库系统简介】 达梦数据库管理系统(DM,DamoDB)是中国自主研发的一款高性能、高可用性的关系型数据库管理系统。...在实际项目中,一定要注意选择正确的方言,以避免因语法不兼容导致的问题。

    sqlserver以及mysql hibernate xml映射语句

    - **`hibernate.dialect`**:指定数据库方言,对于SQL Server,该值通常为`org.hibernate.dialect.SQLServerDialect`。 - **`mapping`**:指定Hibernate映射文件的位置,例如`&lt;mapping resource="com/hibernate/User...

    Hibernate配置文件.pdf

    - `dialect`: 配置了特定数据库的方言,例如`org.hibernate.dialect.SQLServerDialect`。 - `myeclipse.connection.profile`: 可能是MyEclipse IDE中的数据库配置文件名。 - `connection.password`: 指定数据库...

    Hibernate配置手册.txt

    -- &lt;property name="connection.url"&gt;jdbc:microsoft:sqlserver://localhost:1433;SelectMethod=cursor;DatabaseName=pubs &lt;property name="connection.driver_class"&gt;...

    Hibernate工作中应用的总结.doc

    &lt;property name="hibernate.dialect"&gt;org.hibernate.dialect.SQLServerDialect ``` - 可以通过设置`hibernate.show_sql`为`true`来显示Hibernate生成的SQL语句,便于调试。同时,`hibernate.hbm2ddl.auto`属性...

    Hibernate+IDEA 2018 一个hibernate程序

    &lt;property name="hibernate.dialect"&gt;org.hibernate.dialect.MySQL57Dialect &lt;!-- HBM2DDL 自动处理数据库模式 --&gt; &lt;property name="hibernate.hbm2ddl.auto"&gt;update &lt;!-- 是否显示SQL语句 --&gt; ...

    Hibernate较完整资料

    - `dialect` 属性定义了方言,这里是 `org.hibernate.dialect.SQLServerDialect`,用于处理 SQL Server 特有的语法。 - `show_sql` 设置为 `true`,会在控制台打印出执行的 SQL 语句,便于调试。 - `mapping` ...

    hibernate配置文件以及类映射文件常用写法1

    这里,`hibernate.connection.*`属性用于设置数据库连接信息,`hibernate.dialect`定义了数据库方言,便于Hibernate生成对应的SQL语句。`hibernate.hbm2ddl.auto`控制了数据库表的自动创建或更新,如设为`update`,...

    hibernate要点

    - **方言设置**:Dialect的选择决定了Hibernate如何生成特定于目标数据库的SQL语句,例如MySQL、Oracle或SQL Server等。 - **映射文件**:`Configuration`类负责加载实体映射文件,这些文件描述了Java对象与数据库...

    hibernate.zip

    2. **方言设置**:指定使用的SQL方言,如`&lt;property name="hibernate.dialect"&gt;org.hibernate.dialect.MySQLDialect&lt;/property&gt;`,适应不同的数据库系统。 3. **会话工厂配置**:如`&lt;property name="hibernate....

    Hibernate-add学习

    - **dialect**: 指定了Hibernate使用的方言,它告诉Hibernate如何处理特定数据库的SQL语法差异。 - **MySQL**: `org.hibernate.dialect.MySQLDialect` - **Oracle**: `org.hibernate.dialect.Oracle9Dialect` - *...

    用hibernate连接mycat的例子

    同时,由于Mycat提供了自己的SQL解析和执行机制,因此在Hibernate的`hibernate.dialect`属性中,应选择与Mycat兼容的方言,如`org.hibernate.dialect.MySQL5InnoDBDialect`。 接下来,创建实体类并进行映射。在...

    hibernate介绍

    - **net.sf.hibernate.dialect.***:数据库方言实现,用于处理不同数据库特有的特性。 - **net.sf.hibernate.eg.***:示例类。 - **net.sf.hibernate.engine.***:核心引擎相关的API。 - **...

    Struts+Hibernate模板开发笔记

    &lt;property name="dialect"&gt;org.hibernate.dialect.Oracle9Dialect ... &lt;mapping resource="com/yourpackage/Demo.hbm.xml"/&gt; &lt;mapping resource="com/yourpackage/Image.hbm.xml"/&gt; ... &lt;/hibernate-...

    Hibernate面试题-详尽解析

    - **配置示例**: 例如,在配置文件中可以指定`org.hibernate.dialect.MySQL5InnoDBDialect`,表示使用MySQL的InnoDB引擎相关的SQL方言。 #### 四、Hibernate控制下的POJO呈现的三种状态 - **4.1 transient(暂态)...

    hibernate的jar包和教程N多本

    8. 支持的数据库:Hibernate支持多种数据库,如MySQL、Oracle、PostgreSQL、SQL Server等,通过不同的数据库方言(Dialect)实现与特定数据库的兼容。 9. 批量操作:Hibernate提供了批处理功能,如`batch_size`属性...

    jsf+spring+hibernatre整合笔记

    - 设置方言(`dialect`),例如`MySQL5Dialect`,以适应特定数据库的SQL语法。 - 启用SQL日志输出(`show_sql`),便于调试。 - 设置`hbm2ddl.auto`属性,如“create”用于在每次启动应用时创建新的数据库表结构...

    可以运行的Nhibernate例子+SQL2000数据库

    Nhibernate支持多种数据库,包括SQL Server 2000,通过设置配置文件中的dialect参数可以指定。 在提供的压缩包中,你可能找到一个已经配置好的Nhibernate项目,包括实体类、映射文件、配置文件、以及可能的示例查询...

Global site tag (gtag.js) - Google Analytics