zoukankan      html  css  js  c++  java
  • HQL语句中数据类型转换,及hibernate中createQuery执行hql报错

    一、HQL语句中数据类型转换:

      我们需要从数据库中取出序号最大的记录,想到的方法就是使用order by子句进行排序(desc倒序),然后取出第一个对象,可是当初设计数据库时(我们是在原来的数据库的基础上开发新系统),竟然将序号字段的类型设成了varchar2,真是让人郁闷,这样的话,如果排序的话,就是对字符串排序,12是比2小的数,那么就需要转换一下类型。

         以下写法调整中是错误的,不能执行,报空指针错误:select cast(t.a as Integer) from table_1 t

        我也使用了这段代码,同样报空指针异常,不知道怎么回事,我的脑袋里突然冒出一个想法,将Integer的I变为小写,代码如下:

    public List findByPlanId(String id){   
         return getHibernateTemplate().find("from edu.bjtu.port.domain.DetailOfPlanForDayAndNight p where p.id.planId=? order by cast(p.id.detailId as integer) desc",id);   
    }  

      这样就成功了。

           这段代码的另一个让我注意的地方是,当使用复合主键时,创建一个主键类,然后想要使用其中的一个主键进行查询,必须要这样写  p(实体类).id(主键类).planId(其中的某个主键),下面是对应的配置文件:

      XML代码:

    <class name="edu.bjtu.port.domain.DetailOfPlanForDayAndNight" table="PD1_DNPLAN_DTL" schema="SOMIS">  
               <composite-id name="id" class="edu.bjtu.port.domain.DetailOfPlanForDayAndNightId">  
                   <key-property name="planId" type="java.lang.String">  
                       <column name="DNPLANID" length="8" />  
                   </key-property>  
                   <key-property name="detailId" type="java.lang.String">  
                       <column name="NO" length="2" />  
                   </key-property>  
               </composite-id>  

      其实这个问题在Hibernate开发手册中有写,只是我还没看到,之所以想到这样写,完全是突然灵光乍现。不过看来手册还要继续好好研究啊~

    实例:HQL语句中cast(version as integer),小写

    public GenuineManagementStatic queryNewVersion(Integer softId) {
            List<GenuineManagementStatic> list = getSession().createQuery(" from " + this.clazz.getName() + " this WHERE this.softId=:softId  order by cast(version as integer) desc LIMIT 0,1")
                    .setParameter("softId", softId)
                    .list();
            if (list.size() > 0) {
                return list.get(0);
            }
            return null;
        }

     

     二、hibernate中createQuery执行hql报错:

    1、实体类和数据库的表不能映射在一起。

      报错的代码:

    org.hibernate.hql.ast.QuerySyntaxException: news is not mapped [select id, type,title ,author,message,date from news where type = 1 order by date desc]
        org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:180)
        org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:111)
        org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:93)
        org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:327)
        org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3441)

      解决方法:修改sql语句

    select id, type,title ,author,message,date from News where type = 1 order by date desc

      数据库名和实体名,千万要注意

    2、将1中的hql语句修改之后,别以为万事大吉,其实暗藏一个问题:就是使用  Interator 遍历是会出现类似这样的错误,如果不遍历只求大小的话,还好,可以正常得出结果,但是一旦遍历,始终得不出结果。

      仔细查看问题就出在这个hql语句上。

    java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.xzsz.model.News
        com.xzsz.dao.impl.NewsDaoImpl.getNews(NewsDaoImpl.java:37)
        com.xzsz.service.impl.NewsServiceImpl.getNews(NewsServiceImpl.java:24)
        sun.reflect.GeneratedMethodAccessor42.invoke(Unknown Source)
        sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        java.lang.reflect.Method.invoke(Method.java:597)

      解决方法,将hql语句修改为:from News where type = 1 order by date desc

      另外,可以限制查询条数(10条)

    Query q = this.getSession().createQuery(hql);
     //限制条数
    q.setFirstResult(0);
    q.setMaxResults(10);
    return q.list();
  • 相关阅读:
    IIS 404.17 错误解决方案
    复制文件夹
    Sliverlight Slide 的左右滑动
    Web前端学习第三天——————HTML篇.013图片格式
    Web前端学习第三天——————HTML篇.010布局与选择器
    Web前端学习第二天——————HTML篇.009css
    Web前端学习第一天—————HTML篇.004个人简历制作
    Web前端学习第二天——————HTML篇.008表单
    Web前端学习第一天——————HTML篇.004百度云盘目录
    Web前端学习第三天——————HTML篇.011选择器权重
  • 原文地址:https://www.cnblogs.com/goloving/p/7597674.html
Copyright © 2011-2022 走看看