序数パラメータは1ベースであることを忘れないでください! - HibernateTemplate

順序パラメータは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);

To

getHibernateTemplate().find("
    from Domain d where d.domainName = ?", domainName);

問題は解決し、コードはエラーなしで実行されます。

Note
HibernateTemplateによって生成されたエラーメッセージは本当に誤解を招くものです!!!