近期做了一个空间
数据查询分页展示的控件
基于Hibernian的 /**
 * 该方法用sql来获取分页显示的数据
 * @param HibernateSessionFactory.getSession();
 * @param sqlstr 查询语句
 * @param pageNo 页码
 * @param page_size 每页显示条目
 * @return List 返回第pageNo页的数据
 * 参考http://tech.it168.com/j/d/2007-02-01/200702011251562.shtml
 */
@SuppressWarnings("unchecked")
public List findCutPageForSQL(Session session,final String sqlstr,final int pageNo,final int page_size){
String queryString = sqlstr;
queryString+=" limit "+(pageNo-1)*page_size+","+page_size;
  System.out.println("$"+queryString);
return session.createSQLQuery(queryString).list();
}
其中定义了如上方法用来调用sql语句
能够打印出如下sql语句
$ select id,syslogdate,hostIp,facilities,levels,message from Historysyslogdailup
但抛出如下错误:
org.hibernate.MappingException: No Dialect mapping for JDBC type: -1
at org.hibernate.dialect.TypeNames.get(TypeNames.java:56)
at org.hibernate.dialect.TypeNames.get(TypeNames.java:81)
at org.hibernate.dialect.Dialect.getHibernateTypeName(Dialect.java:192)
at org.hibernate.loader.custom.CustomLoader.getHibernateType(CustomLoader.java:161)
at org.hibernate.loader.custom.CustomLoader.autoDiscoverTypes(CustomLoader.java:131)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1678)
at org.hibernate.loader.Loader.doQuery(Loader.java:662)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.doList(Loader.java:2145)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
at org.hibernate.loader.Loader.list(Loader.java:2024)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:111)
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1655)
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:164)
at com.by.demo.data.CutPage.findCutPageForSQL(CutPage.java:56)
at com.by.demo.data.GetDataList.GetDataListForSQL(GetDataList.java:137)
at com.by.demo.data.DBSource.findDataForSQL(DBSource.java:52)
at com.by.demo.data.Data.GetDataList(Data.java:53)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.directwebremoting.impl.ExecuteAjaxFilter.doFilter(ExecuteAjaxFilter.java:34)
at org.directwebremoting.impl.DefaultRemoter$1.doFilter(DefaultRemoter.java:428)
at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:431)
at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:283)
at org.directwebremoting.servlet.PlainCallHandler.handle(PlainCallHandler.java:52)
at org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:101)
at org.directwebremoting.servlet.DwrServlet.doPost(DwrServlet.java:146)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)经分析发现是由于message字段在mysql中为text造成的改成varchar类型数据就出来了
但是我数据库中这个字段必须是text类型的        <property name="message" type="java.lang.String">
            <column name="message" length="65535">
                <comment>信息</comment>
            </column>
        </property>我应该如何修改上面的映射配置文件或者修改其它的地方?
高手指教
不胜感激

解决方案 »

  1.   

    creatSqlQuery 方法不是还要关联一个实体类吗?
      

  2.   

    对于如下的属性:
    private String dtaContent;  @Lob(type = LobType.CLOB, fetch = FetchType.LAZY)
      @Column
      public String getDtaContent() {
        return dtaContent;
      }
    Hibernate会默认对应到MySQL的Text上去。Text是有65535字节限制的。
      

  3.   


    org.hibernate.MappingException: No Dialect mapping for JDBC type: -1 hbm.xml文件 可以直接使用<property >不必使用子元素,其中type属性使用hibernate 的类型string如下:
    <property name="message" column="message" type="string">
      

  4.   


    他说的默认对应 可能是说hibernate 访问属性的方式,hibernate可以直接访问对象属性,并根据hbm.xml映射文件映射到对应的字段,hibernate也可以通过setter/getter方法访问属性, 他说的就是后者,也是最常用的。
    其实,你这地方的问题 最有可能的原因就是  类型映射的问题,hibernate 识别不了你的映射
      

  5.   

    还有 多说一句,实现分页或 记录限制,可以通过hql来实现
    设置firstResult和maxResult就可以了 
    没有必要使用sql 并且limit是mysql特有的,限制了移植性
      

  6.   

      你这个问题 我说2点
      1,通过Query对象,可以设定分页条件,你那个  queryString+=" limit "+(pageNo-1)*page_size+","+page_size;
    没有必要
      2,对于text列,应该是Clob对象吧,不能直接select ,需要单独处理,可以考虑对这个列使用延迟处理(hibernate2不支持)  <property name="message" type="java.lang.String"  lazy="true">
    确实需要读取的话参考hibernate对 Clob的处理
      

  7.   

    No Dialect mapping for JDBC type: -1
    没有设置方言?
    在hibernate.cfg.xml中配置方言:<property name="dialect">org.hibernate.dialect.MySQLDialect</property>  
      

  8.   

    org.hibernate.MappingException: No Dialect mapping for JDBC type: -1异常是因为hibernate不支持数据库中的text类型,就是说hibernate没有注册该类型,而我们往往要用到这个类型   
      
    解决办法:最简单的是用hql文,不用sql   
      
    但有些时候不得不用sql,网上很多修改配置文件或者自己创建类继承等的方法,但个人觉得简单好用的办法是在取数据的时候用CONVERT函数,将text转成varchar,简单方便   
      
    例如:CONVERT(varchar(100), isnull(bz, ''))   
      
    bz是text类型变量名,isnull函数判断下是否为空   
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/JavaAlpha/archive/2010/09/08/5870927.aspx问题原因:数据库表中有text类型的字段,而Hibernate在native查询中没有注册这个字段,因此发生这个错误。    
    解决方法:写一个类、修改hibernate配置文件。 写一个Dialect的子类,这里我 extends MySQL5Dialect类:    
    package xxx.xxx;    //xxx.xxx自己根据情况来写 import java.sql.Types;    
    import org.hibernate.dialect.MySQL5Dialect;    
    public class DialectForInkfish extends MySQL5Dialect {    
        public DialectForInkfish() {    
            super();    
            registerHibernateType(Types.LONGVARCHAR, 65535, "text");    
        }    
    }    
    修改Hibernate配置文件hibernate.cfg.xml,把   
    <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>    
    修改为:   
    <property name="dialect">com.ibm.crl.inkfish.config.DialectForInkfish</property>  
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/JavaAlpha/archive/2010/09/08/5870927.aspx