2010-05-08 6 views
8

J'ai un problème avec Hibernate Native Query. J'ai un SELECT qui sélectionne la tranche de tableau (base de données PostgreSQL). Le problème est que Hibernate reconnaît la partie suivante: ": 300" de "SELECT my_array [1: 300] ..." comme paramètre nommé et je reçois l'exception suivante: Tous les paramètres nommés n'ont pas été définis.Problème de requête native Hibernate avec des paramètres nommés

J'ai essayé d'échapper les deux points (:) avec ':', '::' mais sans succès.

La version 3.2 Mise en veille prolongée est

Répondre

4

Je n'utilise pas PostgreSQL mais si vous ne trouvez pas une bonne solution pour ce problème, vous pouvez mettre en œuvre un intercepteur (étendre EmptyInterceptor) et modifier votre requête sur onPrepareStatement(String sql).

Cela signifie que vous pourriez utiliser quelque chose comme my_array[1|300] et le réécrire comme my_array[1:300] pour contourner le problème des paramètres nommés.

Modifier: Je ne suis pas sûr à 100% que ce qui précède fonctionne (réécriture SQL natif et si l'analyseur de requête permettrait le caractère spécial). J'ai seulement fait ce qui précède dans HQL et les critères où je passais l'indice de l'indice comme un commentaire de requête.

+0

Merci, travaille également avec les requêtes natives :) – dime

3

Le colon n'est pas évitable dans Hibernate lui-même (connu Bug depuis 2005).

1
create function array_slice(a anyarray, start int4, end int4) returns anyarray as 
$$ 
    SELECT a[start:end]; 
$$ 
language(sql); 

Appelez maintenant cette fonction à la place. Je n'ai pas essayé mais ça marchera comme ça.

1

MyInterceptor extends EmptyInterceptor fonctionne comme mentionné par cherouvim.

n'oubliez pas

<property name="hibernate.ejb.interceptor" value="MyInterceptor"/> 

dans persistence.xml

Questions connexes