Wie setze ich positionierte / benannte Parameter dynamisch in die JPA-Kriterienabfrage ein?

9

Der Hibernate-Provider generiert keine vorbereitete Anweisung für nicht-string -Typ-Parameter, es sei denn, sie werden standardmäßig auf entityManager.createQuery(criteriaQuery).setParameter(Parameter p, T t); festgelegt, wie von EclipseLink erledigt.

Wie legen Sie solche Parameter fest, wenn sie dynamisch zur Laufzeit bereitgestellt werden? Zum Beispiel

%Vor%

In diesem Fall ist der Parameter für prodName ein String-Typ-Parameter. Daher wird es automatisch an einen Positionsparameter ? gebunden. Der Rest ( Nicht-String-Typ ) ist jedoch nicht. Sie alle werden nur durch ihre Werte ersetzt.

Sie müssen auf createQuery() gesetzt werden, indem Sie zum Beispiel

verwenden %Vor%

Wie legen Sie solche dynamischen Parameter fest, damit eine vorbereitete Abfrage generiert werden kann?

Dies ist in EclipseLink in der Tat nicht erforderlich, da sie automatisch den Positionsparametern zugeordnet werden.

Kann dies mit dem Hibernate-Provider gemacht werden?

Ich verwende JPA 2.0 von Hibernate 4.2.7 final.

Wenn alle Parameter gesetzt sind, würde die durch obige Kriterienabfrage erzeugte Aussage wie folgt aussehen.

%Vor%

Ich habe gerade die obige Kriterienabfrage unter EclipseLink (2.3.2) ausgeführt, die zur Erzeugung der folgenden SQL-Anweisung führte.

%Vor%

d. h. eine parametrisierte Abfrage.

Das Folgende ist nicht möglich.

%Vor%

Dadurch würde die Ausnahme java.lang.IllegalArgumentException: Name of parameter to locate cannot be null ausgelöst.

    
Tiny 23.11.2013, 11:40
quelle

1 Antwort

4

Warum nicht CriteriaBuilder.parameter verwenden? Und warum sollen Parameter wie Positionsparameter im generierten SQL eingefügt werden? Möchten Sie Ihre Abfrage optimieren, indem Sie sie auf SQL Server vorbereiten und dann nur Parameter senden? Ich denke, in diesem Fall ist es besser, CriteriaBuilder.parameter explizit anzugeben.

Und BTW haben Sie QueryDSL gesehen?

    
Alexey Andreev 25.11.2013 18:37
quelle