2010-02-04 7 views
1

J'utilise hibernate avec mySQL et j'ai le problème suivant: Je fais une requête nativeSQL sur une table avec, entre autres, une colonne qui est longue. Cette colonne peut atteindre null. Maintenant, je reçois l'exception suivante lors de la demande:Hibernate, valeurs nulles et nativeSQL

4-feb-2010 10.31.00 org.hibernate.type.NullableType nullSafeGet 
INFO: could not read column value from result set: nazeuro; String index out of range: 0 
java.lang.StringIndexOutOfBoundsException: String index out of range: 0 
     at java.lang.String.charAt(String.java:686) 
     at org.hibernate.type.CharacterType.get(CharacterType.java:29) 
     at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:163) 
     at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:189) 
     at org.hibernate.loader.custom.CustomLoader$ScalarResultColumnProcessor.extract(CustomLoader.java:474) 
     at org.hibernate.loader.custom.CustomLoader$ResultRowProcessor.buildResultRow(CustomLoader.java:420) 
     at org.hibernate.loader.custom.CustomLoader.getResultColumnOrRow(CustomLoader.java:317) 
     at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:606) 
     at org.hibernate.loader.Loader.doQuery(Loader.java:701) 
     at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) 
     at org.hibernate.loader.Loader.doList(Loader.java:2220) 
     at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104) 
     at org.hibernate.loader.Loader.list(Loader.java:2099) 
     at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289) 
     at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695) 
     at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142) 
     at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152) 
     at Views.Components.QuickLookup$updater.run(QuickLookup.java:102) 

J'ai été googler pour résoudre le problème, j'ai même trouvé les messages ici sur le SO, mais à chaque fois qu'il est sur le mappage des objets et de l'écriture des classes personnalisées pour gérer la question . Dans cette situation, j'ai besoin d'un tableau Object. Je sais qu'une solution pourrait être de changer la table mais je l'éviterais car je dois travailler avec un db préexistant. Avez-vous des solutions possibles?


SQLQuery query = sess.createSQLQuery("SELECT * from " + table + " WHERE " + filter + " LIKE '" + search + "%'"); 
        System.out.println(query.toString()); 
        List<Object[]> result = query.list(); 
+1

Ainsi, la colonne est CHAR (1) '? Et quel est le type dans votre entité? S'il vous plaît montrer votre code. – Henning

+0

Il n'y a pas de type dans mon entité, en fait c'est une requête SQL NATIVE, qui retournera un Object [] par ligne (un objet par colonne). Donc il n'y a pas d'entité ... – gotch4

+0

Nous avons besoin de voir votre code en particulier le mappage Hibernate – Mark

Répondre

3

Quelle est la version mise en veille prolongée utilisez-vous? En 3.3.2, cela est CharacterType.get():

public Object get(ResultSet rs, String name) throws SQLException { 
    String str = rs.getString(name); 
    if (str==null) { 
     return null; 
    } 
    else { 
     return new Character(str.charAt(0)); 
    } 
} 

Dans le cas où ce ne fut pas évident, l'exception indique que vous avez un vide, chaîne non nulle ("") du jeu de résultats, ce qui provoque CharacterType à barf , car ce n'est pas une valeur attendue pour un CHAR(1). (Ceci est une colonne CHAR(1), est-il?)

+0

J'utilise 3.2.5. Je pense que je devrais obtenir une connexion JDBC et contourner hibernate ... avez-vous de meilleures idées? – gotch4

+0

@Gotch: C'est certainement une option, vous n'utilisez aucune de ses fonctionnalités à ce stade, sauf HQL. Je serais curieux de savoir comment une chaîne vide peut en faire l'ensemble de résultats. Si vous interrogez manuellement la colonne CHAR avec 'WHERE charCol = ''', obtenez-vous un résultat? Si oui, peut-être le pilote JDBC est en faute, qui sait. Bonne chance. – Henning

0

utiliser la fonction native GAUCHE ou DROITE pour modifier le type de données de colonne d'origine

supposons que ce fut la requête SQL donnant l'erreur nom d'utilisateur, sélectionnez des Utilisateurs

changer avec: sélectionnez GAUCHE (nom d'utilisateur,) les utilisateurs de

le nombre doit être égale à la taille du champ

0

Utilisez l'expression CASE pour chaque colonne de caractères dans votre table

CASE nom_colonne = '' puis '' END AUTRE nom_colonne