Bonjour à tous,
J'utilise JPA 2.0 avec Glassfish. Derrière il y a une BD PostGreSql.
J'ai une entité qui contient une ArrayList d'entiers int. Notez que la classe ArrayList reste générique puisque je ne peux pas la paramétrer avec un type primitif tel que int. Cet attribut est stocké sous forme de BLOB en base de donnée, ce qui ne constitue pas un problème pour moi à priori.
Maintenant, je souhaite faire une requête qui me renvoit uniquement l'entité dont l'attribut ArrayList d'entier correspond à celui que je passe en paramètre. Une comparaison des représentations binaires devrait me suffire par exemple.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 @Entity public class SnmpOid implements Serializable { @Id @SequenceGenerator(name = "SNMP_OID_SEQ", sequenceName= "SNMP_OID_SEQ") @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="SNMP_OID_SEQ") private Long id; private String label; private ArrayList oid; // Attribut en question! private boolean pollable; @Transient private String oidString = null; ...
J'ai essayé directement en JPQL:
ou via un CriteriaBuilder:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 String jpqlQuery = "SELECT c FROM SnmpOid c WHERE c.oid = :poid"; Query query = em.createQuery(jpqlQuery); query.setParameter("poid", (Object)oid); return query.getResultList();
Mais je récolte l'erreur suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 CriteriaBuilder cb = getEntityManager().getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(); Root<SnmpOid> snmpOid = cq.from(SnmpOid.class); cq.where(cb.equal(snmpOid.get(SnmpOid_.oid), (Object)oid)); cq.select(snmpOid); Query q = getEntityManager().createQuery(cq); return q.getResultList();
J'ai l'impression qu'il considère mon ArrayList comme une liste de paramètres pour la requête et non comme un objet binaire à comparer.ATTENTION: Local Exception Stack:
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERREUR: l'opérateur n'existe pas : bytea = record
Indice*: Aucun opérateur ne correspond au nom donné et aux types d'arguments.
Vous devez ajouter des conversions explicites de type.
Position*: 57
Error Code: 0
Call: SELECT ID, LABEL, OID, POLLABLE FROM SNMPOID WHERE (OID = (?,?,?,?,?,?,?,?,?,?,?,?,?,?))
bind => [14 parameters bound]
Query: ReadAllQuery(referenceClass=SnmpOid sql="SELECT ID, LABEL, OID, POLLABLE FROM SNMPOID WHERE (OID = ?)")
at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:333)
...
Quelqu'un aurait-il une idée pour que ma recherche basée sur une liste d'entier se passe correctement?
Merci!
Partager