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
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.
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?
Tags und Links jpa hibernate prepared-statement eclipselink criteria