2009-08-01 4 views
2

J'utilise la base de données Oracle 10g et EclipseLink, je dois obtenir la dernière clé insérée dans la table donc j'ai créé cette requêteSélectionnez nvl (max (c.EmployeeId), 0) dans JPQL?

javax.persistence.Query q = 
        em.createQuery("SELECT nvl(MAX(c.myAtt),0) " + 
         "from myTable as c"); 
      return Integer.parseInt(q.getSingleResult().toString()); ` 

Mais lorsque la table est empy (parfois il peut se vide) J'obtiens EXCEPTION D'ARGUMENT ILEGAL, cause: Exception JPQL, détail: "Une exception est survenue lors de la création d'une requête dans EntityManager". Qu'est-ce que je fais mal?

+0

Le problème se produit-il à em.createQuery() ou à q.getSingleResult()? Pouvez-vous définir le niveau de journalisation approprié pour voir le SQL généré (Hibernate a ceci, pas sûr d'EclipseLink)? – javashlook

Répondre

1

Paraphrasant Apu, « Je ne sais pas quelle partie de cette question pour corriger d'abord » :-)

D'abord, la récupération dernière clé est insérée de cette façon est une chose très © BAD Il est dangereux , inefficace et surtout inutile puisque votre JPA le fait déjà pour vous: une fois que vous insérez votre entité, sa propriété d'identifiant sera automatiquement mise à jour pour contenir sa clé primaire. Deuxièmement, pour ce qui est de votre requête, "myTable" n'est pas quelque chose que vous utiliseriez dans JPQL, vous devez spécifier votre nom d'entité à la place (par exemple, si vous associez "Car" à "CAR_TABLE" vous devriez utiliser "Car" au lieu de "CAR_TABLE" dans les requêtes JPQL). En outre, NVL() n'est pas supporté par JPQL. Il est pris en charge (sorte de, via Expression.ifNull()) par EclipseLink Expressions. Pas que tu en aies besoin dans un scénario comme celui-ci, de toute façon.

1

En quelqu'un d'autre aurait quant à lui inséré quelque chose dans Autorizaciones puis vous recevez le mauvais identifiant

1

NVL() est maintenant pris en charge dans les versions les plus récentes de JPQL

1

Vous pouvez utiliser la fonction COALESCE. Il peut être utilisé pour obtenir le même résultat que nvl. Par exemple:

select nvl(columna,'1') from table 
select COALESCE(columna,'1') from table 
Questions connexes