• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:prepareStatementのデータ型の設定について)

prepareStatementのデータ型の設定について

このQ&Aのポイント
  • Oracleでスケジュールの公開判断をするためには、is_publishというデータ型を作成します。このデータ型はtrueかfalseの値を持ち、NUMBER(1)のNOT NULL制約が設定されます。
  • StrutsのActionFormにはisPublishという変数があり、この変数に値を設定したり取得したりするためにsetterとgetterが作成されています。
  • ScheduleDAO.javaのcreateメソッドでは、スケジュールデータをデータベースに挿入するためのSQL文が作成されます。is_publishの値をPreparedStatementの9番目のパラメータに設定しようとしていますが、setIntメソッドでIntやInteger型の引数を受け取ることができずエラーが発生しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • gigamac
  • ベストアンサー率57% (8/14)
回答No.1

stmt.setInt(9, schedule.isPublish()); ですが、 stmt.setInt(9, schedule.isPublish().intValue() ); でいかがでしょう? オートアンボクシングが機能しません。intValue()でint値をsetIntメソッドへ渡してください。

takeshif
質問者

補足

gigamacさんご回答ありがとうございます。 教えていただいたとおり一部はうまくいきましたが、 また新たな問題にあたっています。 if (s.getUserId()!=user.getId()&&!s.isPublish().intValue()) の行でコンパイルエラーに なります 演算子!は引数の型intで未定義です <CalendarLogic.java> public class CalendarLogic { private static ScheduleDAO scheduleDAO = new ScheduleDAO(); public static MonthCalendar getCalendar(User user, int year, int month) { // スケジュールの読み込み ArrayList schedules = scheduleDAO.findByDate(year, month, i); // ログイン中ユーザではなく非公開なら削除 Iterator ite = schedules.iterator(); while(ite.hasNext()) { Schedule s = (Schedule)ite.next(); if (s.getUserId()!=user.getId()&&!s.isPublish().intValue()) { ite.remove(); } } date.setSchedules(schedules); ご教授よろしくお願いします。

その他の回答 (3)

  • gigamac
  • ベストアンサー率57% (8/14)
回答No.4

>>ArrayList schedules = scheduleDAO.findByDate(year, month, i); ですが、find・・・メソッドは恐らく引数を基にデータベースからデータを検索するメソッドだと思います。たぶん、引数year,month,iで渡した条件で一致するデータが見つからなかった為、ArrayListのオブジェクトがnullである可能性が高いですね。findByDateメソッドの詳細が解らないので、あくまでも推測ですが。 何にしても、当初の質問より逸脱していますので、情報を付け加えて新たに再質問される事をご要望いたします。

takeshif
質問者

お礼

gigamacさんご回答いろりろとありがとうございました。 情報を付け加えて新たに再質問してみます。いろいろと勉強になりました。ArrayList schedules = scheduleDAO.findByDate(year, month, i); のなかにはデータは設定されていることを確認しています。 また、質問の機会がございましたらそのときはよろしくおねがいします。

  • gigamac
  • ベストアンサー率57% (8/14)
回答No.3

↓失礼しました。 if (s.getUserId() != user.getId() && s.isPublish().intValue() == 0) { です。

  • gigamac
  • ベストアンサー率57% (8/14)
回答No.2

【補足に関して】 if (s.getUserId()!=user.getId()&&!s.isPublish().intValue()) { ですが、!s.isPublish().intValue()の部分がマズイです。 処理的にどうされたいのか解らないのでナントモ言い難いですが、 s.isPublish().intValue()が0ならという条件をつけたいのでしょうか。 なら、 if (s.getUserId() != user.getId() && s.isPublish().intValue() != 0) { です。C言語とは違うので論理値はboolean型でないとエラーが出ます。int型の場合、あくまで数値と比較という形になります。 私が誤解しているよなら、補足お願いします。

takeshif
質問者

補足

最初、データベースとの接続に必要な情報を保持するフィールド変数をmysqlやpostgresSQL用 の設定からoracle用に変えたときに いかのエラーが発生したのでisPublishをboolean型からnumber型に変えたらうまくいくと思ったのですが、 java.lang.NullPointerException at jp.co.javaboost.schedule.data.CalendarLogic.getCalendar(CalendarLogic.java:61) Iterator ite = schedules.iterator();の行で 以下のエラーが発生します。デバックしてみたところnullが設定されていました。 nullのときに教えてもらった設定にするとうまくいきません。 ためしにダミーのデータでtrueの設定で入れてみましたが同じところで落ちます。 // スケジュールの読み込み ArrayList schedules = scheduleDAO.findByDate(year, month, i); // ログイン中ユーザではなく非公開なら削除 Iterator ite = schedules.iterator();←エラーの箇所 while(ite.hasNext()) { Schedule s = (Schedule)ite.next(); if (s.getUserId() != user.getId() && s.isPublish() == 0) { ite.remove(); } } date.setSchedules(schedules); week.add(date); } <Schedule.javaの以下内容です> public class Schedule { // 公開/非公開フラグ (trueで公開) private int isPublish; /** * 公開/非公開を変更する * @param b trueで予定を公開 */ public void setPublish(int b) { isPublish = b; } /** * このスケジュールを公開するかどうか * @return 公開するならtrue */ public int isPublish() { return isPublish = 0; } ご教授よろしくおねがいします。

関連するQ&A