2016-09-08 1 views
1

J'ai un problème avec une fonction inférieure et supérieure dans JPA (Hibernate). Dans mon application, un utilisateur doit ajouter un nouvel élément à la base de données, mais le nom doit être unique. Pour y parvenir, je dois comparer la chaîne entrée par l'utilisateur avec les chaînes de la base de données et ignorer la casse en vérifiant cela.Les fonctions Hibernate inférieure et supérieure ne fonctionnent pas avec les caractères spéciaux polonais

Malheureusement, comme j'utilise la fonction Hibernate pour faire toutes les données en majuscules (afin de les comparer) tout fonctionne bien, sauf pour les caractères spéciaux polonais qui restent les mêmes.

C'est le code que je l'ai utilisé à des fins de test afin de vérifier si elle fonctionne:

TypedQuery<String> query = em.createQuery("SELECT upper(i.name) FROM Item i", String.class); 

for (String name: query.getResultList()) 
    System.out.println(name); 

Et c'est ce que je reçois:

  • Czysty bandaz
  • Maly CHEMIK
  • MAYY MECHANIK
  • SPRZęT
  • ŚPIWóR
  • Srodek DEZYNFEKUJąCY
  • Srodek CZYSZCZąCY

Toutes les lettres doivent être tubé supérieure. Dans la base de données, chaque première lettre d'un premier mot est toujours en majuscule. Le problème concerne des caractères tels que: , 0, 0, 0, 0, - ils devraient ressembler à , mais ils ne semblent pas les reconnaître comme un seul caractère. qui ne diffère que par rapport à l'affaire.

La même chose se produit lorsque j'utilise une fonction inférieure. Les caractères polonais ne sont pas affectés du tout et restent les mêmes.

Je ne sais pas si cela ne concerne que des caractères polonais ou d'autres langues.

Je serais très reconnaissant pour toute allusion à ce sujet.

EDIT: J'utilise Hibernate 5.2.2 Final avec la base de données SQLite et le pilote Xerial 3.8.11.2.

EDIT2: La même chose se produit si j'essaie d'y parvenir en utilisant une requête SQL native avec Hibernate.

+0

quelle version utilisez-vous? –

+0

@khalilM J'utilise Hibernate 5.2.2 Final et Xerial 3.8.11.2 avec la base de données SQLite :) – Bloodlex

+0

mais "³" fonctionne bien? –

Répondre

0

J'ai déjà trouvé la solution. Il s'est avéré que SQLite ne prend pas en charge le classement Unicode. Il ne peut prendre en charge que les caractères latins ASCII tout en utilisant la fonction supérieure ou le tri inférieur.

Il existe une extension (SQLite ICU Extension) avec laquelle SQLite doit être compilé pour utiliser le classement Unicode (ou d'autres classements), mais en ce qui me concerne, ce n'est pas une solution aussi simple que je le souhaite c'est être. J'ai décidé de changer le fournisseur de base de données à H2, qui supporte par défaut le classement Unicode sans effectuer de modifications et fonctionne comme un charme maintenant :)

Ce n'est donc pas la faute d'Hibernate, mais celle de SQLite. Merci beaucoup pour votre aide :)