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();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM