2

以下は私の PrepareStatement コードです。正しい SQL クエリを生成しません。また、最初の println ステートメントを超えることはありません。また、クエリで ** NOT SPECIFIED ** と表示されます (以下を参照してください)。

どうすればこれを修正できますか?

   ps1 = con.prepareStatement(
                     "select stuId, name, relationsName, houseAddress, houseNumber from temp where "
                        + " stuId like '?%' and " 
                        + " sex = '?' and " 
                        + " name like '?%' and "
                        + " age BETWEEN ? and ? and "
                        + " relationsName like '?%' " 
                        + " order by name asc limit 0, 150000 "
               );

               System.out.println("ps1 Before : " + ps1);

出力:

ps1 前: com.mysql.jdbc.JDBC4PreparedStatement@14d55de: stuId、名前、関係名、houseAddress、houseNumber を temp から選択します。and name like '?%' and age BETWEEN ** NOT SPECIFIED ** and ** NOT SPECIFIED ** and RelationsName like '?%' order by name asc limit 0, 150000

この点を超えることはありません。また、クエリでNOT SPECIFIEDと表示されます (最後まで参照してください)。

洞察をお願いします。

       ps1.setString(1, stuId);
       ps1.setString(2, gender);
       ps1.setString(3, name);
       ps1.setInt(4, startAge);
       ps1.setInt(5, endAge);
       ps1.setString(6, relationsName);

       System.out.println("ps1 After : " + ps1);

       rs = ps1.executeQuery();
4

1 に答える 1

11

プレースホルダーが一重引用符で囲まれているため、パラメーターではなく値になります。あなたはそれを取り除くべきです、例えば

ps1 = con.prepareStatement(
                 "select stuId, name, relationsName, houseAddress, houseNumber from temp where "
                    + " stuId like ? and " 
                    + " sex = ? and " 
                    + " name like ? and "
                    + " age BETWEEN ? and ? and "
                    + " relationsName like ? " 
                    + " order by name asc limit 0, 150000 "
           );

ステートメントのLIKE場合、SQL ではなく Java で値を連結する必要があります。

ps1.setString(1, stuId + '%');
于 2013-01-11T14:17:17.807 に答える