使用Spring JDBCTemplate在查询中动态选择字段名称

时间:2010-05-31 15:57:50

标签: spring dynamic jdbc

我遇到Spring JdbcTemplate替换参数的问题。

我有这个问题:

    <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" />

这个方法:

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;
}

我想拥有?填充表示用户正在使用的语言环境的字符串。因此,如果用户是brasilian,我会从表fix_i18n向他发送列pt_br,否则,如果他是美国人,我会向他发送列en_us。

我从这个方法得到的是PostgreSQL异常org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1"

如果我用替换 fi。?(区域设置的列名是唯一的,那么如果我在数据库中运行此查询就可以正常工作)我得到的是从方法返回的每个对象都有字符串区域设置到字段名称。即在名称字段中,我有“en_us”。

让我找到工作的唯一方法是将方法更改为:

    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;
}

并将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>

我的DAO扩展了Spring JdbcDaoSupport,适用于所有其他查询。我做错了什么?

1 个答案:

答案 0 :(得分:0)

我认为你不应该发送任何列信息。这是持久层的东西,不应该泄漏。

如果您需要特定于语言环境的视图,请使用Spring工具执行此类操作。它与你如何持久保存数据毫无关系。