Denken Sie daran, dass die Ordinalparameter auf 1 basieren! - HibernateTemplate

Denken Sie daran, dass Ordnungsparameter 1-basiert sind! - HibernateTemplate

Problem

HibernateTemplate-Code…

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

Wenn ich den obigen Code ausführe, erhalte ich die folgende Fehlermeldung

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)

Lösung

Ich gehe hinein und studiereHibernateTemplate.java Datei und finde unten Code

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

Aus dem obigen Code geht hervor, dass die HibernateTemplete 0-basiert anstelle von 1-basiert verwendet. Ist dies ein Problem mit der Bibliothek im Frühjahr oder im Ruhezustand? Da die Fehlermeldung angegeben ist, müssen die Parameter bei 1 beginnen. Ich habe eine Lösung wie "Change Spring" oder "Hibernate Library" ausprobiert, aber sie funktioniert nicht.

Es scheint, ich bin auf dem falschen Weg, ich muss gleich wieder anfangen, eine Lösung zu finden. Zuerst studiere ich meinen eigenen Code ………… !!! Ich kann mir nicht vorstellen, wie nachlässig ich bin, ich habe einen dummen Fehler in meinem Code gemacht, dies ist kein Spring- oder Hibernate-Problem, es ist mein Syntaxfehler.

Wechsel von

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

To

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

Problem gelöst, Code ohne Fehler mehr ausführen.

Note
Die von HibernateTemplate generierte Fehlermeldung ist wirklich irreführend !!!