2017-02-05 3 views
0

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?

+0

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

+0

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

Antwort

0

Das Problem nun behoben ist, nachdem ich auf 5.1.0.Final Version Hibernate herabgestuft

+0

Es gab eine Reihe von Änderungen an der 'Query'-Schnittstelle, einige waren notwendig, da 5.2.x das Zusammenführen von' hibernate-entitymanager' in 'hibernate-core' beinhaltete '. Ich würde vorschlagen, wenn Sie Kuriositäten wie diese sehen, öffnen Sie eine JIRA, so dass wir einen Blick darauf werfen können und überprüfen, ob es ein Abwärtskompatibilitätsproblem ist oder nicht. – Naros

Verwandte Themen