私のHQLクエリで何が問題になっていますか?

私は自分のHQLクエリに問題があり、見つけることができません。多分ここの誰かが私を助けることができます。私はフォーラム全体とGoogleで検索しましたが、私の質問にはうまく答えられません。

これは私のクラスのマッピングですSize:

<?xml version="1.0"?>

<!-- Generated Dec 1, 2011 3:07:44 PM by Hibernate Tools 3.2.1.GA -->

    
        
            
            
        
        
            
        
        
            
            
        
    

そして、私はこのコードを使用して私のテーブルで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でこのクエリを実行すると、エラーが発生します。

クエリ: `SELECT size.tshirtsize FROM Size as size 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.(HQLQueryPlan.java:77)
at org.hibernate.engine.query.HQLQueryPlan.(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のすべてのオブジェクトを取得するのに最適です。

1

4 答え

HQLで変数の前後の引用符を削除します。これは整数(文字列ではありません)です。

"... WHERE size.idSize = " + s
2
追加された
+1し、より安全なクエリパラメータを使用する
追加された 著者 Sebastien Lorber,
これはまだ動作しません。それは私のマッピングと関係がありますか?私はユーザーの袋に怠け者=真を設定したのですか?
追加された 著者 Digihash,

Integerの場合、引用符を追加する必要はありません。

この方法を試してください

 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();
  }
2
追加された

try this : WHERE size.id = " + s

0
追加された

コレクションのサイズを取得するために使用されるHQLの予約語であるため、別名 size を使用しないでください( Hibernate Docs )を参照してください。

クエリパラメータを使用すると、今後のさまざまな問題に役立ちます。それを返す前に、 tshirtSize のnull可否もチェックしてください。あなたの例では、これは良いアプローチです:

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

それが役に立てば幸い

0
追加された