2011-04-04 3 views
2

Quelqu'un peut-il me dire, pourquoi cela ne fonctionne pas:JPA comme opérateur avec Integer

criteria.add(cb.like((myentity.<Integer>get("integerid")).as(String.class), "2%")) 

Je reçois l'erreur suivante:

The object [2%], of class [class java.lang.String], from mapping [org.eclipse.persistence.mappings.DirectToFieldMapping[integerid-->MYENTITY.INTEGERID]] with descriptor [RelationalDescriptor(org.example.model.MyEntity --> [DatabaseTable(MYENTITY)])], could not be converted to [class java.lang.Integer] 

est la seule solution pour modifier la propriété myinteger à un chaîne dans le modèle, afin que je puisse utiliser l'opérateur like?

BR

Répondre

2

JPA ne prend pas en charge like() avec Integer, uniquement Strings. Certaines bases de données supportent comme avec un entier et d'autres non. EclipseLink devrait permettre l'utilisation de like() avec Integer (à condition que votre base de données le prenne en charge). Quelle version utilisez-vous? Peut nécessiter d'utiliser> = 2.1. Si cela échoue sur la dernière version, veuillez enregistrer un bug.

Vous pouvez également convertir l'entier en une chaîne en utilisant un « CHAR, « TO_CHAR » ou « fonction CONVERT » en fonction de votre base de données. L'API de critères prend en charge une fonction() API pour appeler une fonction native.

Notez que le comme() API est pas destiné à la conversion de nombre entier en chaîne, il est pour la coulée à une entité de sous-classe.

+0

Merci beaucoup. Je testais avec le derby db. Je vais donc vérifier avec notre production db (postgres). – reen

1

Je pense: vous essayez de mettre une chaîne en integerId qui est un entier.

En outre, un nombre entier sur une valeur entière n'est pas possible.

Modifiez votre String.class en Integer.class. et "2%" par une valeur entière

+0

Je veux utiliser l'opérateur comme avec un entier. Pour la requête 2% je veux toutes les valeurs comme 2, 20, 21, 222, etc ... C'est pourquoi j'ai essayé de convertir l'entier en chaîne. – reen

+0

Désolé n'a pas bien lu votre code. – Twister

1

J'ai fait face à la même question. J'utilise JPA2.0 et EclipseLink 2.3 que la mise en œuvre.

La colonne codeClient est actuellement un nombre entier dans ma base de données. L'annotation @Convert convertit simplement ma colonne Entier en une colonne Chaîne.

De cette façon, je peux utiliser un prédicat similaire sur les nombres. Je sais que c'est un vieux message mais si cela peut aider quelqu'un d'autre!

0

Voici un exemple de la façon dont cela fonctionne avec JPA, donc vous pouvez utiliser LIKE avec entier dans votre JPQL.

public List<MyEntity> getMyEntities(String idStr) { 
    return entityManager.createQuery("SELECT m FROM MyEntity m WHERE CAST(m.id AS string) LIKE :idStr") 
     .setParameter("idStr", "%" + idStr+ "%").getResultList(); 
} 

Note: i tested it and worked fine with me, i am using JPA 2.1 with Hibernate provider.