2

JUNIT テストに HSQLDB を使用しています。

HSQL で実行されていないが、Sybase ドライバーで実行されるクエリがあります。Spring JDBC を使用してクエリを実行し、HSQLDB の hsqldb.1.8.1.jar ファイルを実行しています。

以下はコードです:

public static final String ORG_CODE_QUERY = "SELECT ORG_CODE = org.name " +
         "  FROM " + ORGANIZATION  + " org " +
         " WHERE org.id   = ? " +
         "   AND org.industry = ?  ";


public List<String> getOrgCode(RequestPayload rqstPayload) {
        return getJdbcTemplate().query(ORG_CODE_QUERY, new Object[]{rqstPayload.getId(),rqstPayload.getIndustry()}, new ResultSetExtractor<List<String>>() {
            public List<String> extractData(ResultSet rs) throws SQLException {
                List<String> list = new ArrayList<String>();
                while(rs.next()) {
                    list.add(rs.getString("ORG_CODE"));
                }
                return list;
            }
        });
    }

春の構成:

 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="org.hsqldb.jdbcDriver" />
        <property name="jdbcUrl" value="jdbc:hsqldb:mem:test" />
        <property name="user" value="sa" />
        <property name="password" value="" />
        <property name="minPoolSize" value="5" />
        <property name="maxPoolSize" value="10" />
    </bean>

このクエリは、Sybase データソースが JDBCTemplate に渡されると完全に実行されますが、HSQLDB データソースが渡されると失敗します。

以下のように文字列を変更すると、HSQL でも実行されます

public static final String ORG_CODE_QUERY = "SELECT org.name as ORG_CODE" +
         "  FROM " + ORGANIZATION  + " org " +
         " WHERE org.id   = ? " +
         "   AND org.industry = ?  ";

残念ながら、本番 Code を変更することはできません。

以下のエラーが表示されます。

Caused by: java.sql.SQLException: Column not found: ORG_CODE in statement 

この問題の改善点があれば教えてください。

ありがとう

4

1 に答える 1

2

SELECT <alias> = <column definition>HSQL は、Sybase SQL クエリで使用している構文をサポートしていません。

両方のデータベース システムで機能するクエリのバージョンを見つけるか、Sybase を使用する場合は Sybase 構文を実行し、HSQL を使用する場合は HSQL 構文を実行できる何らかのスイッチをクラスに含める必要があります。

于 2012-09-14T13:25:12.663 に答える