In unserem Projekt ist es erforderlich, die generierte Abfrage zu ändern, bevor es ausgelöst wird.JPA Hibernate in Klausel Abfrage
So haben wir eine benutzerdefinierte Repository-Factory, die die zusätzlichen Parameter der Abfrage hinzufügen wird.
So wird es jetzt gemacht.
Wir haben eine Abfrage Delegatte die javax.persistence.Query implementiert, wo wir die erzeugte Abfrage abfangen und fügen Sie die zusätzlichen Parameter
Dies funktionierte bisher gut mit Hibernate 4.1.4
Jetzt sind wir aufgerüstet Hibernate 5.2.2 und jpa 2.2
Grundsätzlich lesen wir die Parameter und setzen sie zurück zum Query-Objekt. Es funktioniert für alle Arten von Parametern außer Liste.
private void setParameters(Query query) {
try {
Iterator<?> iter = getParameters().iterator();
while (iter.hasNext()) {
LOGGER.debug("Setting Parameter...");
Parameter param = (Parameter) iter.next();
Object obj = null;
try {
obj = getParameterValue(param);
} catch (Exception e) {
LOGGER.debug("****Exception while getting param value****:" + e.getMessage());
}
query.setParameter(param.getName(), obj);
}
} catch (Exception e) {
LOGGER.error("****Exception in setParameters:****:" + e.getMessage());
}
}
Es scheitert in Szenarien, in denen Klausel IN verwendet wird und Liste wird als Parameter übergeben, wie unten
@Query("select new com.mypackage.UserInfo(m.usrmstId, m.usrName)
from UsrMst m where m.usrName in :names ")
public List<UserInfo> getUserByNames(@Param("names")List<String> names);
ich die unten Ausnahme erhalten, während diese Art von Erfassungsparameter zu lesen.
Could not resolve QueryParameter reference [[email protected]] to QueryParameterBinding
Gibt es Änderungen in Hibernate 5.2.2 in der Art, wie Listenparameter behandelt werden?
Im Debug-Modus habe ich festgestellt, dass expectedType für org.hibernate.engine.query.spi.NamedParameterDescriptor-Objekt String ist. Wäre das ein Problem? Sollte es keine Liste sein?
Haben Sie versucht, zu prüfen, ob 'obj' ist ein' Collection' Instanz und wenn ja, ruft '# setparameterList' anstatt' # setParameter' oder ist der Fehler vom '# getParameterValue' Aufruf? – Naros
Der Fehler trat beim Aufruf von getParameter Value auf. Ich habe auch versucht, setParameterList zu setzen, aber diese Methode war in der Query-Schnittstelle nicht verfügbar. Das Problem ist nun behoben, nachdem ich Hibernate auf 5.1.0 heruntergestuft habe. Endgültige Version – lives