2010-05-31 4 views
1

J'ai un problème avec le remplacement des paramètres par Spring JdbcTemplate.Sélectionnez dynamiquement les noms de champs dans une requête avec Spring JDBCTemplate

J'ai cette requête:

<bean id="fixQuery" class="java.lang.String"> 
    <constructor-arg type="java.lang.String" 
     value="select fa.id, fi.? from fix_ambulation fa 
       left join fix_i18n fi 
       on fa.translation_id = fi.id order by name" /> 

Et cette méthode:

public List<FixAmbulation> readFixAmbulation(String locale) throws Exception { 
    List<FixAmbulation> ambulations = this.getJdbcTemplate().query(
      fixQuery, new Object[] {locale.toLowerCase()}, 
      ParameterizedBeanPropertyRowMapper 
        .newInstance(FixAmbulation.class)); 
    return ambulations; 
} 

Et je voudrais avoir la? rempli avec la chaîne représentant les paramètres régionaux que l'utilisateur utilise. Donc, si l'utilisateur est brésilien, je lui enverrais la colonne pt_br de la table fix_i18n, sinon s'il est américain je lui enverrais la colonne en_us.

Ce que je reçois de cette méthode est une exception PostgreSQL org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1"

Si je remplace fi.? avec juste ? (le nom de la colonne de l'environnement local est unique, donc si j'exécute cette requête dans la base de données cela fonctionne très bien) ce que je reçois est que chaque objet retourné par la méthode a la chaîne locale dans le nom du champ. C'est à dire. dans le champ de nom j'ai "en_us".

La seule façon de le faire travailler que j'ai trouvé de changer la méthode en:

public List<FixAmbulation> readFixAmbulation(String locale) throws Exception { 
    String query = "select fa.id, fi." + locale.toLowerCase() + " as name " + fixQuery; 
    this.log.info("QUERY : " + query); 
    List<FixAmbulation> ambulations = this.getJdbcTemplate().query(
      query, 
      ParameterizedBeanPropertyRowMapper 
        .newInstance(FixAmbulation.class)); 
    return ambulations; 
} 

et la mise fixQuery à:

<bean id="fixQuery" class="java.lang.String"> 
    <constructor-arg type="java.lang.String" 
     value=" from telemedicina.fix_ambulation fa 
       left join telemedicina.fix_i18n fi 
       on fa.translation_id = fi.id order by name" /> 
</bean> 

Mon OAC étend printemps JdbcDaoSupport et fonctionne très bien pour tous d'autres requêtes. Qu'est-ce que je fais mal?

Répondre

0

Je ne pense pas que vous devriez envoyer des informations sur les colonnes. C'est du matériel de niveau de persistance et ne devrait pas avoir à fuir.

Si vous souhaitez une vue spécifique aux paramètres régionaux, utilisez les fonctions Spring pour effectuer une telle opération. Cela n'a absolument rien à voir avec la façon dont vous persistez dans les données.

+0

Vous pourriez le voir en train d'envoyer le nom de la locale, pour recevoir les données correctes. Quoi qu'il en soit, le dao est invoqué à partir d'une instance flambée, pour obtenir des données pour une application flexible. Mais le problème ne concerne pas les informations sur les locales ou les colonnes. C'est juste sur la façon d'avoir un nom de colonne dynamique remplacer le "?" dans une requête (dans ce cas, il est envoyé à partir de la couche de vue, mais cela n'a pas d'importance). – Francesco

Questions connexes