2011-07-01 19 views
3

名前付きパラメータを使用して文字列をクエリに挿入しようとしています。私は春とhibernateTemplateを使用しています。そして、私はかなり休止状態になっています。過去には無名の名前付きパラメータを使用していましたが、両者が隣り合っているときにエラーが発生したようです。私は以下の私の問題に類似のサンプルコードを作っています(手元の問題を強調するために簡略化されています)。 orderByにはフィールドの文字列が含まれ、orderDirectionにはASCまたはDESCが含まれます。Hibernateでの連続する名前付きパラメータの問題(Spring HibernateTemplate)

public List<HashMap<String, Object>> exampleList(String orderBy, String orderDirection) { 
    logger.debug(orderBy); 
    logger.debug(orderDirection); 

    final String queryString = "SELECT new map("+ 
           "a.id AS id, "+ 
           "a.name AS name, "+ 
           "a.number AS number) "+ 
           "FROM Asset a "+ 
           "ORDER BY :orderBy :orderDirection"; 

    String[] parameterNames = {"orderBy", "orderDirection"}; 
    Object[] parameterValues = {orderBy, orderDirection}; 

    List<HashMap<String, Object>> results = (List<HashMap<String, Object>>) hibernateTemplate.find(queryString, parameterNames, parameterValues); 

    return results; 
} 

コンソールには、私のパラメータデバッグ:

DEBUG: com.myOrg.myProject.asset.AssetDAO - a.id 
DEBUG: com.myOrg.myProject.asset.AssetDAO - desc 

をそして私は、私は、クエリ文字列に値を直接置くことでそれをテストしてきたように、このクエリは、自分自身で問題なく動作します知っています。私はこれが悪い習慣であることを知っています。なぜ私はそれをやっていないのですか?

次のように私が手にエラーが(スタックトレースは、読みやすくするために短縮しますが、これが唯一のエラーであると私は要求に応じて、完全なスタックトレースを提供することができている)である。

再び
SEVERE: Servlet.service() for servlet dmat3 threw exception 
org.hibernate.hql.ast.QuerySyntaxException: unexpected token: : near line 1, column 118 [SELECT new map(a.id AS id, a.name AS name, a.number AS number) FROM com.gsipt.dmat3.asset.Asset a ORDER BY :orderBy :orderDirection] 
    at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:31) 
    at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:24) 
    at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:59) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:258) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:157) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111) 
    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) 
    at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:914) 
    at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:1) 
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406) 
    at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374) 
    at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:912) 
    at com.myOrg.myProject.asset.AssetDAO.exampleList(AssetDAO.java:142) 
    at com.myOrg.myProject.navigator.NavigatorController.assetGrid(NavigatorController.java:163) 

、これは単に作品別々のパラメータがある場合は問題ありませんが、それらが一緒に配置されると、これが発生します。名前のないパラメータを使用して同じエラーを再現することができます。 "予期しないトークン"が2番目の "?"クエリ文字列にORDER BY文で意味をなさないように、名前付きまたは名前なしの2つのパラメータを互いに隣り合わせに配置するにはどうすればよいですか。

おかげで、

答えて

1

-Cliffあなたはfind、ない

findByNamedParams

を使用しているがhereを参照してください。 Spring 3 APIについては、hereを参照してください。

ものHibernateTemplateのドキュメントが

NOTE言うことに注意してください:Hibernateは3.0.1のとおり、 トランザクションHibernateのアクセスコード も無地休止 スタイルでコーディングすることができます。したがって、新たに開始された プロジェクトでは、 SessionFactory.getCurrentSession()に基づいて、 標準のHibernate3スタイルのコード化 データアクセスオブジェクトを代わりに採用することを検討してください。

+0

わかりましたが、残念ながらそれを修正しません。実際には、私は何かをデバッグしようとしていたので、私がfindByNamedParamを使用して同じエラーが発生したので、私が 'find'で貼り付けたバージョンは間違いでした。私はあなたのご褒美にちょうど今試してみても、同じエラーがありました。 –

+0

hvgotcodes:SessionFactory.getCurrentSessionに基づくDAOの例はありますか? –

0

どうしてこれらをパラメータ化する必要がありますか? orderByorderDirectionの値がユーザー入力から来ない限り、値をクエリに連結するだけで安全です。

if orderDirection == Sort.ASC) { 
    queryString += " ASC"; 
} 
else { 
    queryString += " DESC"; 
} 

など

+0

私はそれをすることができましたが、それは私が心配している純粋な注射ではありません。私は、それが、きわめて簡単な操作であるように見えるものと、間違っているものを実行しない理由を知りたいと思います。 –

1

あなたは、ORDER BY句のパラメータ(名前付きまたは位置)を使用することはできません。 WHERE句でのみ使用できます。

0

パラメータは、のビルドアップSQL構文では指定しません。ストリングを連結してください。

関連する問題