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 !!!