web-dev-qa-db-ja.com

Java Java.sql.SQLException:準備文の列インデックスが無効です

以下の私のコードは、ユーザーの入力に基づいてデータベースに一連の行を照会します。 SQL Developer内でクエリを試し、テストしましたが、正しい行を返すのは完璧に機能します。そして、入力の例は次のとおりです:2013-01-22

しかし、何らかの理由でJavaの内部でこのエラーが発生しています:

Java.sql.SQLException: Invalid column index

コンソールは、次の行で起動していることを示しています。

preparedStatement.setString(1, to);

完全な接続コード:

ResultSet rs = null;
        PreparedStatement preparedStatement = null;
        try {
            String strQuery =
                    "SELECT homes.home_id, homes.title, homes.description, homes.living_room_count, homes.bedroom_count, homes.bathroom_count, homes.price, homes.sqft,"
                    + " listagg(features.feature_name, '\n') WITHIN GROUP(ORDER BY features.feature_name) features, home_type.type_name"
                    + " FROM homes"
                    + " INNER JOIN bookings ON bookings.home_id <> homes.home_id"
                    + " INNER JOIN home_feature ON homes.home_id = home_feature.home_id"
                    + " INNER JOIN home_type ON home_type.type_code = homes.type_code"
                    + " INNER JOIN features ON home_feature.feature_id = features.feature_id"
                    + " WHERE bookings.booking_end < date '?'"
                    + " OR bookings.booking_start > date '?'"
                    + " GROUP BY homes.home_id, homes.title, homes.description, homes.living_room_count, homes.bedroom_count, homes.bathroom_count, homes.price, homes.sqft, home_type.type_name";

            preparedStatement = conn.prepareStatement(strQuery);//prepare the statement
            preparedStatement.setString(1, to);//insert
            preparedStatement.setString(2, from);//insert
            rs = preparedStatement.executeQuery();//execute query

完全なスタックトレースは次のようになります。

SEVERE: Java.sql.SQLException: Invalid column index
at Oracle.jdbc.driver.OraclePreparedStatement.setStringInternal(OraclePreparedStatement.Java:5317)
at Oracle.jdbc.driver.OraclePreparedStatement.setString(OraclePreparedStatement.Java:5305)
at Oracle.jdbc.driver.OraclePreparedStatementWrapper.setString(OraclePreparedStatementWrapper.Java:248)
at DB.DatabaseConnector.getPropertiesSearch(DatabaseConnector.Java:258)
at DB.SearchServlet.doPost(SearchServlet.Java:47)
at javax.servlet.http.HttpServlet.service(HttpServlet.Java:688)
at javax.servlet.http.HttpServlet.service(HttpServlet.Java:770)
at org.Apache.catalina.core.StandardWrapper.service(StandardWrapper.Java:1550)
at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:281)
at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:175)
at org.Apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.Java:655)
at org.Apache.catalina.core.StandardPipeline.invoke(StandardPipeline.Java:595)
at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:161)
at org.Apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.Java:331)
at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:231)
at com.Sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.Java:317)
at com.Sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.Java:195)
at com.Sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.Java:860)
at com.Sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.Java:757)
at com.Sun.grizzly.http.ProcessorTask.process(ProcessorTask.Java:1056)
at com.Sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.Java:229)
at com.Sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.Java:137)
at com.Sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.Java:104)
at com.Sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.Java:90)
at com.Sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.Java:79)
at com.Sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.Java:54)
at com.Sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.Java:59)
at com.Sun.grizzly.ContextTask.run(ContextTask.Java:71)
at com.Sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.Java:532)
at com.Sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.Java:513)
at Java.lang.Thread.run(Thread.Java:722)

SEVERE:     at Oracle.jdbc.driver.OraclePreparedStatement.setStringInternal(OraclePreparedStatement.Java:5317)
SEVERE:     at Oracle.jdbc.driver.OraclePreparedStatement.setString(OraclePreparedStatement.Java:5305)
SEVERE:     at Oracle.jdbc.driver.OraclePreparedStatementWrapper.setString(OraclePreparedStatementWrapper.Java:248)
SEVERE:     at DB.DatabaseConnector.getPropertiesSearch(DatabaseConnector.Java:258)
SEVERE:     at DB.SearchServlet.doPost(SearchServlet.Java:47)
SEVERE:     at javax.servlet.http.HttpServlet.service(HttpServlet.Java:688)
SEVERE:     at javax.servlet.http.HttpServlet.service(HttpServlet.Java:770)
SEVERE:     at org.Apache.catalina.core.StandardWrapper.service(StandardWrapper.Java:1550)
SEVERE:     at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:281)
SEVERE:     at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:175)
SEVERE:     at org.Apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.Java:655)
SEVERE:     at org.Apache.catalina.core.StandardPipeline.invoke(StandardPipeline.Java:595)
SEVERE:     at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:161)
SEVERE:     at org.Apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.Java:331)
SEVERE:     at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:231)
SEVERE:     at com.Sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.Java:317)
SEVERE:     at com.Sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.Java:195)
SEVERE:     at com.Sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.Java:860)
SEVERE:     at com.Sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.Java:757)
SEVERE:     at com.Sun.grizzly.http.ProcessorTask.process(ProcessorTask.Java:1056)
SEVERE:     at com.Sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.Java:229)
SEVERE:     at com.Sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.Java:137)
SEVERE:     at com.Sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.Java:104)
SEVERE:     at com.Sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.Java:90)
SEVERE:     at com.Sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.Java:79)
SEVERE:     at com.Sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.Java:54)
SEVERE:     at com.Sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.Java:59)
SEVERE:     at com.Sun.grizzly.ContextTask.run(ContextTask.Java:71)
SEVERE:     at com.Sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.Java:532)
SEVERE:     at com.Sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.Java:513)
SEVERE:     at Java.lang.Thread.run(Thread.Java:722)

クエリが正常に動作するときにエラーがスローされる理由はよくわかりませんが、SQL開発者です。 Oracleを使用しています

編集:

結果セットは同じメソッド内でこれに読み込まれます。次に、homesオブジェクトが返されます。

HomeList homes = new HomeList();
homes = new HomeList(rs);

コンストラクターは次のようになります。

public HomeList(ResultSet rs) {
    this();
    try {
        while (rs.next()) {
               list.add(new Home(rs.getInt(1),   
                                 rs.getString(2),
                                 rs.getString(3),   
                                 rs.getInt(4),
                                 rs.getInt(5),
                                 rs.getInt(6),
                                 rs.getInt(7),
                                 rs.getInt(8),
                                 rs.getString(9),
                                 rs.getString(10)
                                     ));
        }//end while
    } catch (SQLException e) {
        e.printStackTrace();
    }//end try
}
19
user1851487

クエリ文字列内のどこでも、ワイルドカードは_?_ではなく_'?'_である必要があります。これで問題が解決するはずです。

編集:

それに追加するには、_date '?'_をto_date(?, 'yyyy-mm-dd')に変更する必要があります。それを試して、私に知らせてください。

31
TechSpellBound

@TechSpellBoundが示唆したように、?サイン。次に、連結文字列の各行の末尾にスペース文字を追加します。それ以外の場合、クエリ全体が(例として一部のみを使用して)送信されます:.... WHERE bookings.booking_end < date ?OR bookings.booking_start > date ?GROUP BY ....

?ORはスペース文字で区切る必要があります。クエリ文字列の必要な場所で実行してください。

2
giorashc

_date '?'_では、_'?'_は値プレースメントではなく_?_のリテラル文字列であるため、クエリにはパラメーターがありません。 dateは、(リテラル)文字列から日付への簡易キャストです。実際にパラメータを設定するには、_date '?'_を_?_に置き換える必要があります。

また、日付であることがわかっている場合は、setDate(..)ではなくsetString(..)を使用してパラメーターを設定します。

0
Mark Rotteveel