Problèmes de compatibilité des requêtes EJB avec SQL
Une requête Enterprise JavaBeans étant compilée en langage SQL, vous devez connaître les problèmes de compatibilité existant entre le langage Java et SQL.
Ces deux langages présentent sur les points suivants des différences qui peuvent être déterminantes pour corriger la formulation des requêtes EJB :
- La sémantique de comparaison des chaînes SQL ne correspond pas exactement à celle du langage Java. Par exemple : "A" (la lettre A) et "A" (la lettre A suivie d'un espace) sont considérées comme égales dans SQL, mais pas dans Java.
- Les comparaisons et l'ordre de classement dépendent de la base de données sous-jacente. Par exemple, si vous utilisez DB2 avec une page de codes EBCDIC, l'ordre de classement n'est pas le même que lorsque le tri est effectué dans un programme Java. Certaines bases de données classent la valeur NULL comme une valeur faible tandis que d'autres la classent comme une valeur élevée.
- Un dépassement arithmétique génère une exception dans SQL, mais pas dans le langage Java.
- Les bases de données SQL utilisent des valeurs minimales et maximales variables pour les valeurs à virgule flottante qui peuvent différer des plages de valeurs à virgule flottante utilisées dans Java. La conversion en langage SQL des valeurs proches des limites des plages de valeurs Java Double peut échouer.
- Les méthodes Java ne peuvent pas être converties en langage SQL ; les requêtes EJB standard ne peuvent donc pas inclure de méthodes Java. Remarque : Vous ne pouvez utiliser de fonctions non convertibles en SQL qu'avec le service de requêtes EJB dynamiques. Ces fonctions comprennent des méthodes Java et des convertisseurs ou des composeurs qui servent au mappage des beans enterprise vers des bases de données relationnelles (RDB). Une requête de sélection ou de recherche standard utilisant l'une de ces fonctions échoue au moment du déploiement et génère le message "Cannot push down query" (impossible de transmettre la requête). (Vous pouvez résoudre ce problème en modifiant soit la requête, soit le mappage.) Toutefois, la phase d'exécution de la requête dynamique traite la requête en exécutant l'opération faisant appel à cette fonction dans le serveur d'applications.