web-dev-qa-db-fra.com

Conversion d'un entier en chaîne en JPQL

Je veux avoir une requête JPQL qui peut ressembler à:

    entityManager.createQuery("Select a.* from A a WHERE CAST(a.num AS TEXT) LIKE '%345%' ", A.class);

où a.num est un entier. Je veux convertir ceci en chaîne pour utiliser les critères LIKE . Cependant, la conversion ci-dessus ne fonctionne pas en JPQL. Toute idée sur comment puis-je mettre en œuvre cela?

4
Pratap

Pourriez-vous être plus précis, quel est votre problème? Avez-vous une sorte d'erreur ou le résultat de la requête est-il faux?

Parce que ce code fonctionne bien pour moi:

session.createQuery("from MyObject where CAST(id as text) like :id").setParameter("id", "%1").getResultList();

J'utilise Hibernate 5.2 et Postgresql 9.5 . En outre, si vous rencontrez des difficultés pour comprendre ce qui ne va pas, vous pouvez essayer de modifier hibernate.cfg.xml ou le fichier de configuration que vous utilisez pour que Hibernate affiche les requêtes qu'il envoie quelque chose comme ça:

<property name="hibernate.show_sql">true</property>
3
Stas Shafeev

J'ai aussi le même besoin. Cela devrait fonctionner avec JPA 2.0 et Hibernate 5.0.2:

entityManager.createQuery(
    "Select a.* from A a WHERE CONCAT(a.num, '') LIKE '%345%' ", A.class);
4
Hendy Irawan

Vous pouvez utiliser la fonction to_char() dans la clause select, mais vous devrez sélectionner tous les champs a.num séparément et non avec *.

Et dans postgresql, vous devrez spécifier un masque pour to_char()function. Il s'agirait donc de to_char(field, mask); par exemple, nous pouvons fournir 'FM999999999999999999' en tant que masque pour accepter le maximum de chiffres possible. 

Votre requête ressemblerait à ceci:

Select *, to_char(a.num, 'FM999999999999999999') as num from A a WHERE num LIKE '%345%'

Vous pouvez consulter Postgresql Fonctions de formatage de types de données pour plus de détails.

Pour écrire la requête dans votre code avec EntityManager, vous pouvez créer une requête native à l'aide de la méthode .createNativeQuery(). Voici comment votre code devrait être:

em.createNativeQuery("Select *, to_char(a.num, 'FM999999999999999999') as num from A a WHERE num LIKE '%345%'");
0
cнŝdk

La requête correcte est: entityManager.createQuery ("Sélectionnez un. * dans un WHERE CAST (a.num AS String) LIKE '% 345%'", A.class);

0
Pratap