質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.11%

検索条件をViewで入力し、Java側でTIME型のデータベース参照をしたいです。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,092

korosuke_Z

score 8

前提・実現したいこと

SpringMVC,PostgreSQLを用いて、
開始時間と終了時間の間のデータをデータベースから拾ってくる。
結果をViewで表示したいです。
検索条件の入力をViewで行う。

start_timeとend_timeはtime型(time without time zone)です。
他の型の列(date型やvarchar型の)はDaoクラスから拾い、表示までできることは確認しています。

発生している問題・エラーメッセージ

org.springframework.web.util.NestedServletException: Request processing failed;
nested exception is org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback;
org.postgresql.util.PSQLException: ERROR: "$1"またはその近辺で構文エラー

該当のソースコード

/*略*/
@Repository
public class TestDao {
  private static final String TEST_SEARCH= 
  "SELECT start_time,end_time "
  +"FROM test_table "
  +"WHERE start_time BETWEEN TIME ?"
  +"AND TIME '24:00' "
  +"AND end_time BETWEEN TIME '00:00'"
  +"AND TIME ?";

 @Autowired
 private JdbcTemplate jdbcTemplate;

  public List<TestForm>TestResult(TestForm form) {

  String startTime = form.getStartTime();
  String endTime = form.getEndTime();

  List<Map<String, Object>> list=
  jdbcTemplate.queryForList(TEST_SEARCH,startTime,endTime);

 List<TestForm> formList = new ArrayList<TestForm>();

  for(Map<String,Object> result:list){
    TestForm resultForm =new TestForm ();

    resultform.setStartName(result.get("start_time").toString());
    resultform.setEndName(result.get("end_time").toString());

   formList.add(resultForm);
  }
  return formList;
}

試したこと

"

  •   FROM test_table WHERE start_time
    BETWEEN TIME '00:00' TIME '24:00'
    AND end_time BETWEEN TIME '00:00' TIME '24:00';
    をデータベース側で直接実行したらデータを全件拾うことに成功しました。
  •   CAST(start_time AS TIME)を使ってみましたが特に意味はありませんでした。
  •   SimpleDateFormat format= new SimpleDateFormat("hh:mm:ss");
    Date time = format.parse(startTime);
    を使っても効果はありませんでした。
  •   入力内容が間違っていると思い(例:"24:00:00")が格納されたStringの変数を作り、queryForListに格納しましたがエラーメッセージは変わらず。
  •   java.sql.Time javaSqlTime = java.sql.Time.valueOf(startTime)も効果なし。

補足情報(言語/FW/ツール等のバージョンなど)

Java/SpringMVC/STS/PostgreSQL/A5M2

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

  FROM test_table WHERE start_time 
BETWEEN TIME '00:00' TIME '24:00' 
AND end_time BETWEEN TIME '00:00' TIME '24:00';

とありますが、ANDが必要ではないでしょうか?

SELECT start_time,end_time
FROM test_table WHERE start_time
BETWEEN TIME '00:00' AND TIME '24:00'
AND end_time BETWEEN TIME '00:00' AND TIME '24:00';

::のキャストではどうでしょうか

"SELECT start_time,end_time "
+"FROM test_table "
+"WHERE start_time BETWEEN ?::time AND TIME '24:00' "
+"AND end_time BETWEEN TIME '00:00' AND ?::time";

サンプルJavaですが出力されましたので、ご参考に添付いたします

import java.sql.*;
class DbTest {
    public static void main(String[] args) {
        String stime;
        String etime;
        try {
            // JDBCドライバの登録
            String driver = "org.postgresql.Driver";
            // データベースの指定
            String server   = "127.0.0.1";   // PostgreSQL サーバ ( IP または ホスト名 )
            String dbname   = "hogeDB";         // データベース名
            String url = "jdbc:postgresql://" + server + "/" + dbname;
            String user     = "hogehoge";         //データベース作成ユーザ名
            String password = "password";     //データベース作成ユーザパスワード
            Class.forName (driver);
            // データベースとの接続
            Connection con = DriverManager.getConnection(url, user, password);
            // テーブル照会実行
            //Statement stmt = con.createStatement ();
            String sql = "SELECT start_time,end_time "
                                +"FROM test_table "
                                +"WHERE start_time BETWEEN ?::time AND TIME '24:00' "
                                +"AND end_time BETWEEN TIME '00:00' AND ?::time";
                        PreparedStatement stmt = con.prepareStatement(sql);
                        //パラメーターセット
                        stmt.setString(1, "06:00");
                        stmt.setString(2, "23:00");

                        ResultSet rs = stmt.executeQuery();
            // テーブル照会結果を出力
            while(rs.next()){
               stime = rs.getString("start_time");
               etime = rs.getString("end_time");
               System.out.println("開始:" + stime);
               System.out.println("終了:" + etime);
            }
            // データベースのクローズ
            rs.close();
            stmt.close();
            con.close();
        } catch (SQLException e) {
            System.err.println("SQL failed.");
            e.printStackTrace ();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace ();
        }
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/16 09:38

    ご指摘の通りでしたが、やはりJava側だと実行ができませんでした...
    エラーメッセージも変わらず。

    キャンセル

  • 2016/09/16 09:48

    ?::timeで実行できました!
    ご指摘ありがとうございます!詰まっていた問題が解決できました...!!

    キャンセル

  • 2016/09/16 09:52

    行き違いになりましたが良かったです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる