Rappelez-vous que les paramètres ordinaux sont basés sur 1! - HibernateTemplate

N'oubliez pas que les paramètres ordinaux sont basés sur 1! - HibernateTemplate

Problème

Code HibernateTemplate…

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

Lorsque j'exécute le code ci-dessus, je frappe le message d'erreur suivant

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)

Solution

Je vais à l'intérieur et étudie le fichierHibernateTemplate.java et trouve le code ci-dessous

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();
        }
    });
}

À partir du code ci-dessus, HibernateTemplete utilise 0-based au lieu de 1-based. S'agit-il d'un problème de bibliothèque de printemps ou d'hibernation? Étant donné que les paramètres indiqués par le message d'erreur doivent commencer à 1. J'ai essayé une solution comme changer le ressort ou la bibliothèque d'hibernation, mais cela ne fonctionne pas…

Il semble que je sois dans la mauvaise direction, je dois recommencer à trouver une solution, d’abord j'étudie mon propre code………… !!! Je ne peux pas imaginer à quel point je suis imprudent, j'ai fait une erreur stupide sur mon code, ce n'est pas un problème de printemps ou d'hibernation, c'est mon erreur de syntaxe.

Changer de

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

To

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

Problème résolu, le code s'exécute plus sans erreur.

Note
Le message d'erreur généré par HibernateTemplate est vraiment trompeur !!!