Question

J'utilise GigaSpaces XAP avec le plugin Hibernate pour charger ma table DB dans le leur cache de grille, malheureusement pour interroger la grille, ils ne supportent pas les recherches directement insensible à la casse.

Ils ont offert 2 solutions:
1- Utilisez requête LIKE (comme SQL) qui est lent (Wont même pas la peine avec cela)
2- Créer une propriété séparée des champs que je veux avoir insensible à la casse.

Alors maintenant, mes choix sont:
1- Créer une colonne supplémentaire dans DB pour avoir champ insensible à la casse (Pas dans cette vie)
2- Créer un plugin chargeur de données personnalisées pour XAP telles que le moment les données sont chargées le champ est stocké dans un properperty « ToLower ». (Pris en charge mais laissera en dernier ressort)

Je ne suis certainement pas aller avec # 1 et je vais laisser le chargeur de données personnalisées en dernier résultat. Donc, mon idée est de ...

class Person {
    String firstName
    String firstNameLower

    public void setFirstName(String firstName) {
        this.firstName = firstName

        this.firstNameLower = firstName.toLowerCase(...);
    }
}

ce que ce travail avec Hibernate? Comme le dataloader de GigaSpace utilise Hibernate et mon POJO est à peu près une classe d'entité. J'utilise mapping XML Hibernate annotations non. Les champs « ToLower » ne seront pas mises en correspondance. Est-ce que Hibernate appel setXXX () sur tous les champs qui sont mis en correspondance ou fait-il un peu de remplacement du code de fantaisie sous le capot et ne remet pas les méthodes setXXX ().

Je pense aussi à une annotation serait bon usage ici, mais ne savez pas comment les mettre en œuvre ou même s'il est possible pour ce cas.

Était-ce utile?

La solution 2

Pour les personnes intéressées.

Il suffit de créer une méthode « tolower () » du champ et ajoutez l'annotation d'index sur cette question et vous pouvez mapper votre POJO de mise en veille prolongée de la manière habituelle.

Autres conseils

Hibernate utiliser des objets proxy, mais les données sont toujours stockées dans votre objet et mise en veille prolongée utilisera les getter / implémentations setter que vous fournissez, de sorte que votre solution devrait fonctionner si vous souhaitez définir la version minuscule, bien que je ne suis pas clair pourquoi vous avez besoin d'une variable d'instance distincte pour stocker la version minuscule.

cet article va sur les bases de procurations.

Si vous configurez Hibernate pour utiliser les champs accesseurs méthode (et non accéder directement aux champs) son comportement par défaut est d'utiliser toute la méthode setXXX ().

Je pense que dans votre cas serait (si Hibernate est utilisé uniquement pour GigaSpace) la meilleure solution pour personnaliser la façon dont Hibernate charger les données, en définissant un type personnalisé à l'aide StringType standrd pour charger les données puis en convertissant en minuscules. ..

Pendant ce temps, si votre système nécessite des données minuscules, ne pouvez pas vous assurez-vous que toutes les chaînes entrées dans la base de données sont en minuscules?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top