2011-12-18 71 views
1

我的HQL查詢出現問題,無法找到它。也許這裏有人可以幫助我。我搜索了整個論壇和Google,但找不到我的問題的好答案。我的HQL查詢有什麼問題?

這是我的班級規模的映射:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated Dec 1, 2011 3:07:44 PM by Hibernate Tools 3.2.1.GA --> 
<hibernate-mapping> 
    <class name="be.digihash.java.servlets.database.Size" table="Size" catalog="wielsbeeksebcdb"> 
     <id name="idSize" type="java.lang.Integer"> 
      <column name="idSize" /> 
      <generator class="identity" /> 
     </id> 
     <property name="tshirtSize" type="string"> 
      <column name="tshirtSize" length="45" not-null="true" /> 
     </property> 
     <bag lazy="true" cascade="all" name="users"> 
      <key column="idUser"/> 
      <one-to-many class="be.digihash.java.servlets.database.User"/> 
     </bag> 
    </class> 
</hibernate-mapping> 

而且我用這個代碼在我的表中選擇ID = 1。

List tshirtSize = null; 
try { 
    tx = session.beginTransaction(); 
    tshirtSize = session.createQuery("SELECT size.tshirtsize FROM Size as size WHERE size.idSize='" + s + "'").list(); 

} catch (Exception e) { 
    System.out.println(e.getMessage()); 
} 
return tshirtSize.get(0).toString(); 

當我運行此代碼時,我得到一個NullPointerException。當我在Netbeans中運行這個查詢時,我得到一個錯誤。

查詢:`選擇size.tshirtsize從尺寸爲尺寸WHERE size.idSize ='1'`` 錯誤:

org.hibernate.QueryException: unexpected token: size.idSize.size [SELECT size.tshirtsize FROM be.digihash.java.servlets.database.Size as size WHERE size.idSize='1'] 
at org.hibernate.hql.classic.FromParser.token(FromParser.java:105) 
at org.hibernate.hql.classic.ClauseParser.token(ClauseParser.java:86) 
at org.hibernate.hql.classic.PreprocessingParser.token(PreprocessingParser.java:108) 
at org.hibernate.hql.classic.ParserHelper.parse(ParserHelper.java:28) 
at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:216) 
at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:185) 
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77) 
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56) 
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72) 
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133) 
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112) 
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623) 

我在做什麼毛病我查詢?

順便說一下,FROM Size as size完美地檢索數據庫中的所有Size對象。

回答

2

拆除圍在HQL您的變量的報價 - 這是一個整數(不是一個字符串):

"... WHERE size.idSize = " + s 
+2

+1和使用查詢參數它的安全 – 2011-12-18 23:57:01

+0

這仍然無法正常工作。它與我的映射有關嗎?我在用戶包中設置了lazy = true? – Digihash 2011-12-19 01:45:16

2

在整數的情況下,你不需要加引號。

嘗試這種方式

String hql = "SELECT size.tshirtsize FROM Size as size WHERE size.idSize=?"; 
List tshirtSize= session.createQuery(hql).setString(0,"123").list(); 
if(tshirtSize!=null && tshirtSize.size>0) 
    { 
     return tshirtSize.get(0).toString(); 
    } 
0

試試這個:WHERE size.id = " + s

0

儘量不要使用別名size,因爲它是一個保留字在HQL用於獲取集合的大小(見Hibernate Docs)。

嘗試使用查詢參數,它們會幫助你解決很多未來的問題。在返回之前還要檢查tshirtSize的可空性。爲了您的例子,這會是一個很好的辦法:

List tshirtSize = null; 
try { 
    tx = session.beginTransaction(); 
    Query query = session.createQuery("SELECT s.tshirtsize FROM Size as s WHERE s.idSize = :idSize"); 
    query.setInteger("idSize", s); 
    tshirtSize = query.list(); 

} catch (Exception e) { 
    System.out.println(e.getMessage()); 
} 
if (tshirtSize != null) { 
    return tshirtSize.get(0).toString(); 
} 
return null; // return new ArrayList(); would be perfectly valid 

希望它可以幫助