序数パラメータは1ベースであることを忘れないでください! – HibernateTemplate
問題
HibernateTemplateコード…
getHibernateTemplate().find("from Domain d where d.domainName = :domainName", domainName);
上記のコードを実行すると、次のエラーメッセージが表示されます
java.lang.IndexOutOfBoundsException: Remember that ordinal parameters are 1-based! ... at org.hibernate.impl.AbstractQueryImpl.determineType(AbstractQueryImpl.java:397) at org.hibernate.impl.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:369)
解決策
私は内部に入り、
HibernateTemplate.java
ファイルを調べ、以下のコードを見つけます
public List find(final String queryString, final Object[]values) throws DataAccessException { return (List) executeWithNativeSession(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { Query queryObject = session.createQuery(queryString); prepareQuery(queryObject); if (values != null) { for (int i = 0; i < values.length; i++) { queryObject.setParameter(i, values[i]); } } return queryObject.list(); } }); }
上のコードから、HibernateTempleteは1ベースの代わりに0ベースを使用しています。これは春か冬眠ライブラリーの問題ですか?エラーメッセージの指定パラメータは1ベースで開始する必要があるためです。私は変更の春や休止状態のライブラリのようないくつかの解決策を試みたが、それは動作していない…
それは私が間違った方向にいるようだ、私は最初に解決策を見つけなければならない、私は自分のコードを勉強する………… !!!私はどのように不注意に私はイメージングを傾ける、私は私のコードで愚かなミスを犯した、これは春や冬眠の問題ではない、それは私の構文エラーです。
から変更する
getHibernateTemplate().find(" from Domain d where d.domainName = :domainName", domainName);
に
getHibernateTemplate().find(" from Domain d where d.domainName = ?", domainName);
問題は解決され、コードはもうエラーなく実行されます。