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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

解決済

1回答

4748閲覧

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

korosuke_Z

総合スコア10

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

0グッド

0クリップ

投稿2016/09/15 06:11

編集2016/09/16 00:37

###前提・実現したいこと
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"またはその近辺で構文エラー

###該当のソースコード

Java

1/*略*/ 2@Repository 3public class TestDao { 4 private static final String TEST_SEARCH= 5 "SELECT start_time,end_time " 6 +"FROM test_table " 7 +"WHERE start_time BETWEEN TIME ?" 8 +"AND TIME '24:00' " 9 +"AND end_time BETWEEN TIME '00:00'" 10 +"AND TIME ?"; 11 12 @Autowired 13 private JdbcTemplate jdbcTemplate; 14 15 public List<TestForm>TestResult(TestForm form) { 16 17 String startTime = form.getStartTime(); 18 String endTime = form.getEndTime(); 19 20 List<Map<String, Object>> list= 21 jdbcTemplate.queryForList(TEST_SEARCH,startTime,endTime); 22 23 List<TestForm> formList = new ArrayList<TestForm>(); 24 25 for(Map<String,Object> result:list){ 26 TestForm resultForm =new TestForm (); 27 28 resultform.setStartName(result.get("start_time").toString()); 29 resultform.setEndName(result.get("end_time").toString()); 30 31 formList.add(resultForm); 32 } 33 return formList; 34}

###試したこと
"

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

FROM test_table WHERE start_time

BETWEEN TIME '00:00' TIME '24:00'
AND end_time BETWEEN TIME '00:00' TIME '24:00';

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

sql

1SELECT start_time,end_time 2FROM test_table WHERE start_time 3BETWEEN TIME '00:00' AND TIME '24:00' 4AND end_time BETWEEN TIME '00:00' AND TIME '24:00';

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

java

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

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

java

1 2import java.sql.*; 3class DbTest { 4 public static void main(String[] args) { 5 String stime; 6 String etime; 7 try { 8 // JDBCドライバの登録 9 String driver = "org.postgresql.Driver"; 10 // データベースの指定 11 String server = "127.0.0.1"; // PostgreSQL サーバ ( IP または ホスト名 ) 12 String dbname = "hogeDB"; // データベース名 13 String url = "jdbc:postgresql://" + server + "/" + dbname; 14 String user = "hogehoge"; //データベース作成ユーザ名 15 String password = "password"; //データベース作成ユーザパスワード 16 Class.forName (driver); 17 // データベースとの接続 18 Connection con = DriverManager.getConnection(url, user, password); 19 // テーブル照会実行 20 //Statement stmt = con.createStatement (); 21 String sql = "SELECT start_time,end_time " 22 +"FROM test_table " 23 +"WHERE start_time BETWEEN ?::time AND TIME '24:00' " 24 +"AND end_time BETWEEN TIME '00:00' AND ?::time"; 25 PreparedStatement stmt = con.prepareStatement(sql); 26 //パラメーターセット 27 stmt.setString(1, "06:00"); 28 stmt.setString(2, "23:00"); 29 30 ResultSet rs = stmt.executeQuery(); 31 // テーブル照会結果を出力 32 while(rs.next()){ 33 stime = rs.getString("start_time"); 34 etime = rs.getString("end_time"); 35 System.out.println("開始:" + stime); 36 System.out.println("終了:" + etime); 37 } 38 // データベースのクローズ 39 rs.close(); 40 stmt.close(); 41 con.close(); 42 } catch (SQLException e) { 43 System.err.println("SQL failed."); 44 e.printStackTrace (); 45 } catch (ClassNotFoundException ex) { 46 ex.printStackTrace (); 47 } 48 } 49} 50

投稿2016/09/15 23:37

編集2016/09/16 00:51
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

korosuke_Z

2016/09/16 00:38

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

2016/09/16 00:48

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

2016/09/16 00:52

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問