Java 冬眠方言

Java 冬眠方言,java,hibernate,Java,Hibernate,我正在使用Hibernate从SQLServer2008访问数据 Session session = sessionFactory.openSession(); String qry="select Form_Id,SUBSTRING( (SELECT ( '' + t2.Form_Layout_Txt) FROM Form_Layout_Info t2 WHERE t1.Form_Id = t2.Form_Id " + " G

我正在使用Hibernate从SQLServer2008访问数据

Session session = sessionFactory.openSession();
String qry="select Form_Id,SUBSTRING( 
       (SELECT ( '' + t2.Form_Layout_Txt) FROM Form_Layout_Info t2  
            WHERE t1.Form_Id = t2.Form_Id " +
            " GROUP BY Form_Layout_Txt FOR XML path('') ), 1,1000000000) 
             FROM Form_Layout_Info t1 GROUP BY  Form_Id";

SQLQuery query = session.createSQLQuery(qry);
recordList = query.list();
我的Hibernate属性是

hibernate.connection.driver_class=com.microsoft.sqlserver.jdbc.SQLServerDriver
hibernate.connection.url=jdbc:sqlserver://localhost:1433;databaseName=abc;integratedSecurity=false;
hibernate.dialect=org.hibernate.dialect.SQLServerDialect
hibernate.connection.username=sa
hibernate.connection.password=p123asc
我收到了以下错误

No Dialect mapping for JDBC type: -9 

如何解决此问题。

您需要在sql server的配置中提供
hibernate.dialogue=org.hibernate.dialogue.sqlserverdialogue

在hibernate.cfg.xml中提供以下内容:

<hibernate-configuration>
    <session-factory name="session-factory">
        .....
        <property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
        ....
 </session-factory>
</hibernate-configuration>
我不知道你用的是哪种方式,所以我都知道

我为您的问题找到了两种解决方案:

  • 尝试将驱动程序更改为jTDS 使用microsoft提供的ms sql server jdbc驱动程序可能会导致此问题,而jTDS不会对此进行投诉

  • 您可能需要显式地将“addScalar”添加到hibernate查询中。您可能会有这样的情况:

    Session session = sessionFactory.openSession();
    String qry="select Form_Id,SUBSTRING( 
       (SELECT ( '' + t2.Form_Layout_Txt) as formLayoutTxt FROM Form_Layout_Info t2  
            WHERE t1.Form_Id = t2.Form_Id " +
            " GROUP BY Form_Layout_Txt FOR XML path('') ), 1,1000000000) 
             FROM Form_Layout_Info t1 GROUP BY  Form_Id";
    
    SQLQuery query = session.createSQLQuery(qry).addScalar("formLayoutTxt", StringType.INSTANCE);
    recordList = query.list();
    
    sess.createSQLQuery(“从猫中选择*); //尝试更改为: sess.createSQLQuery(“从猫中选择*) .addScalar(“ID”,Hibernate.LONG) .addScalar(“名称”,Hibernate.STRING) .addScalar(“生日”,Hibernate.DATE)


  • 此问题与返回数据时进行的类型映射有关。方言中不存在该特定数据类型的映射

    休眠数据类型-


    该错误意味着hibernate不知道如何将JDBC类型“NVARCHAR”映射到hibernate类型

    解决方案1: 像这样使用addScalar:

    Session session = sessionFactory.openSession();
    String qry="select Form_Id,SUBSTRING( 
       (SELECT ( '' + t2.Form_Layout_Txt) as formLayoutTxt FROM Form_Layout_Info t2  
            WHERE t1.Form_Id = t2.Form_Id " +
            " GROUP BY Form_Layout_Txt FOR XML path('') ), 1,1000000000) 
             FROM Form_Layout_Info t1 GROUP BY  Form_Id";
    
    SQLQuery query = session.createSQLQuery(qry).addScalar("formLayoutTxt", StringType.INSTANCE);
    recordList = query.list();
    
    解决方案2:用方言注册Hibernate类型

    public class MySQLServerDialect extends SQLServerDialect {
    
      public MySQLServerDialect() {
        super();
    
        // Register mappings
        registerHibernateType(Types.NVARCHAR, StringType.INSTANCE.getName());
      }
    }
    

    有关更多详细信息,请查看。

    实际上我使用了as hibernate.dialent=org.hibernate.dialent.sqlserver2008dialent。是否正确?我已发布了配置。我可以在您的配置中看到正确的方言。你还在犯错误吗?我相信这个答案是正确的。我使用相同的配置。你能发布完整的异常stacktrace吗?不,它不是空指针异常