Règles de manipulation des types de données dans une requête EJB
Lors de l'utilisation d'une requête EJB pour gérer des types de données, certaines règles doivent être respectées.
Vous pouvez utiliser une zone CMP de n'importe quel type dans une clause SELECT. Vous devez toutefois uniquement utiliser des zones des types suivants dans les conditions de recherche et dans les opérations de regroupement et de tri :
- Types primitifs : byte, short, int, long, float, double, boolean, char
- Types d'objet : Byte, Short, Integer, Long, Float, Double, BigDecimal, String, Boolean, Character, java.util.Calendar, java.util.Date
- Types JDBC : java.sql.Date, java.sql.Time, java.sql.Timestamp
- Chaîne binaire : byte
- une zone CMP de l'un des types de base répertoriés précédemment est mappée vers une colonne SQL à l'aide d'un convertisseur ;
- la zone CMP figure avant un prédicat de base ;
- après le prédicat se trouve un littéral ou un paramètre d'entrée ;
Par exemple, si un convertisseur mappe l'entier 10 vers la valeur de chaîne "Ten", la requête EJB suivante :
e.cmp = 10
est convertie dans la requête SQL suivante :
column = 'Ten'
Si vous incluez un prédicat plus compliqué, comme dans l'exemple suivant :
e.cmp * 10 > e.salary
dans une requête de sélection ou de recherche, vous recevez le message d'erreur Cannot push down query (impossible de transmettre la requête). Utilisez le service de requête EJB dynamique pour ce type de requêtes multifonction ; la phase d'exécution de la requête dynamique traite le prédicat dans le serveur d'applications.
En règle générale, les convertisseurs conservent l'égalité, l'ordre de classement et les valeurs NULL. Si un convertisseur ne répond pas à ces exigences, évitez de l'utiliser pour les opérations de comparaison des zones CMP.
Un type d'utilisateur ne peut pas être utilisé dans une opération ou une expression de comparaison. Vous pouvez toutefois utiliser des zones secondaires du type d'utilisateur dans une expression de chemin d'accès. Prenons, par exemple, la zone addr CMP avec le type com.exam.Address, ainsi que les zones secondaires street, city et state. La syntaxe suivante pour une requête sur cette zone CMP n'est pas valide :
e.addr = ?1
Toutefois, une requête désignant l'une des zones secondaires est valide :
e.addr.street = ?1
Une zone CMP ne peut pas être mappée vers une colonne SQL à l'aide de la sérialisation Java. L'utilisation de la zone CMP dans des prédicats ou des expressions pour les requêtes de déploiement se traduit généralement par le message d'erreur Cannot push down query. La phase d'exécution de la requête dynamique traite l'expression en lisant et en désérialisant toutes les instances du type d'utilisateur sur le serveur d'applications.
Toutefois, ce processus coûteux nuit aux performances. Vous pouvez préserver les performances en utilisant un composeur dans une requête EJB de déploiement. Dans l'exemple précédent, si vous souhaitez mapper la zone addr vers un type binaire, utilisez un composeur pour mapper chaque zone secondaire vers une colonne binaire de la base de données.