QA@IT

DATABASEの中身を全て削除したい。

4977 PV

@ITの記事「Play frameworkのDB操作を楽にするEBeanの基礎知識 (2/3)」についての質問です。

DATABASEの中身は、以下のとおりです。

Parent [id=1, name=新宿太郎, createDate=Sun Apr 08 22:56:25 JST 2012, updateDate=Sun Apr 08 22:56:25 JST 2012]
Parent [id=33, name=新宿太郎, createDate=Sun Apr 08 22:56:25 JST 2012, updateDate=Sun Apr 08 22:56:25 JST 2012]
Parent [id=34, name=代々木太郎, createDate=Sun Apr 08 22:56:25 JST 2012, updateDate=Sun Apr 08 22:56:25 JST 2012]
Parent [id=41, name=新宿太郎, createDate=Sun Apr 08 22:56:25 JST 2012, updateDate=Sun Apr 08 22:56:25 JST 2012]
Parent [id=42, name=代々木太郎, createDate=Sun Apr 08 22:56:25 JST 2012, updateDate=Sun Apr 08 22:56:25 JST 2012]
Parent [id=43, name=原宿太郎, createDate=Sun Apr 08 22:56:25 JST 2012, updateDate=Sun Apr 08 22:56:25 JST 2012]

DATABASE上記3件を消すプログラム

package controllers;

import java.util.List;

import models.Parent;
import play.db.ebean.Model.Finder;
import play.mvc.Controller;
import play.mvc.Result;

public class Application extends Controller {

    public static Result index() {
        Finder<Long, Parent> finder = new Finder<Long, Parent>(Long.class,
                Parent.class);



        // 現在のParentを全検索して表示

        List<Parent> parents = finder.all();

        StringBuilder msg = new StringBuilder();
        for (Parent parent : parents) {
            msg.append(parent.toString()).append("\n");
        }
//      return ok(msg.toString());
//
//削除処理    
         // parent1 の取得(条件を指定した検索)
        Query<Parent> query = finder.where("name='新宿太郎'");
        Parent parent1 =query.findUnique();
        parent1.delete();

        Query<Parent> query = finder.where("name='新宿太郎'");
        Parent parent2 =query.findUnique();
        parent2.delete();

        Query<Parent> query = finder.where("name='代々木太郎'");
        Parent parent3 =query.findUnique();
        parent3.delete();

        // 現在のParentを全検索して表示

        for (Parent parent : parents) {
            msg.append(parent.toString()).append("\n");
        }
        return ok(msg.toString());
    }
}

エラー ブラウザ

Compilation error
エラー: シンボルを見つけられません
In C:\play-2.2.3\firstProject\app\controllers\Application.java at line 30.
27//
28//削除処理    
29       // parent1 の取得(条件を指定した検索)
30        Query<Parent> query = finder.where("name='新宿太郎'");

31        Parent parent1 =query.findUnique();
32      parent1.delete();
33      
34      Query<Parent> query = finder.where("name='新宿太郎'");
35        Parent parent2 =query.findUnique();

エラー コマンドプロンプト

[info] Loading project definition from C:\play-2.2.3\firstProject\project
[info] Set current project to firstProject (in build file:/C:/play-2.2.3/firstProject/)

--- (Running the application from SBT, auto-reloading is enabled) ---

[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Ctrl+D to stop and go back to the console...)

[info] Compiling 1 Java source to C:\play-2.2.3\firstProject\target\scala-2.10\classes...
[error] C:\play-2.2.3\firstProject\app\controllers\Application.java:30: エラー: シンボルを見つけられません
[error]         Query<Parent> query = finder.where("name='新宿太郎'");
[error]         ^
[error]   シンボル:   クラス Query
[error]   場所: クラス Application
[error] C:\play-2.2.3\firstProject\app\controllers\Application.java:34: エラー: シンボルを見つけられません
[error]         Query<Parent> query = finder.where("name='新宿太郎'");
[error]         ^
[error]   シンボル:   クラス Query
[error]   場所: クラス Application
[error] C:\play-2.2.3\firstProject\app\controllers\Application.java:38: エラー: シンボルを見つけられません
[error]         Query<Parent> query = finder.where("name='代々木太郎'");
[error]         ^
[error]   シンボル:   クラス Query
[error]   場所: クラス Application
[error] エラー3個
[error] Picked up _JAVA_OPTIONS: "-Dfile.encoding=SJIS"
[error] (compile:compile) javac returned nonzero exit code
[error] application - 

! @6jo0dh4hm - Internal server error, for (GET) [/] ->

play.PlayExceptions$CompilationException: Compilation error[エラー: シンボルを見つけられません]
    at play.PlayReloader$$anon$1$$anonfun$reload$2$$anonfun$apply$14$$anonfun$apply$16.apply(PlayReloader.scala:304) ~[na:na]
    at play.PlayReloader$$anon$1$$anonfun$reload$2$$anonfun$apply$14$$anonfun$apply$16.apply(PlayReloader.scala:304) ~[na:na]
    at scala.Option.map(Option.scala:145) ~[scala-library.jar:na]
    at play.PlayReloader$$anon$1$$anonfun$reload$2$$anonfun$apply$14.apply(PlayReloader.scala:304) ~[na:na]
    at play.PlayReloader$$anon$1$$anonfun$reload$2$$anonfun$apply$14.apply(PlayReloader.scala:298) ~[na:na]
    at scala.Option.map(Option.scala:145) ~[scala-library.jar:na]
[warn] play - No application found at invoker init

氏名でDATABASEを削除する方法と、idで削除する方法と、DATABASEを空にするまで削除するループ分も教えて下さい。

回答

最初のコンパイルエラーは、import com.avaje.ebean.*;が抜けているからです。

データの削除は、Ebean.deleteクラスメソッドを使います。

  • IDで削除する場合は、エンティティーのクラスとIDを渡します。
  • findUniqueなどで得た1オブジェクトや、複数取得したコレクション(Listなど)は、それを渡します。 findUniqueは、複数のレコードに対して行うとエラーになりますので、findListなどを使います。

.

以下、削除のサンプルです。

package controllers;

import java.util.List;

import models.Parent;
import play.db.ebean.Model.Finder;
import play.mvc.Controller;
import play.mvc.Result;

import com.avaje.ebean.*;

public class Application extends Controller {

    public static Result index() {
        Finder<Long, Parent> finder = new Finder<Long, Parent>(Long.class, Parent.class);

        // nameを指定して削除
        Query<Parent> query = finder.where("name='新宿太郎'");
        List<Parent> parents1 = query.findList();
        Ebean.delete(parents1);

        // idを直接指定して削除
        Ebean.delete(Parent.class, 43);

        // idで取得した1件を削除
        Parent parent43 = finder.byId(43L);
        parent43.delete();

        // すべて削除
        Ebean.delete(finder.all());

        // 現在のParentを全検索して表示
        StringBuilder msg = new StringBuilder();
        for (Parent parent : finder.all()) {
            msg.append(parent.toString()).append("\n");
        }
        return ok(msg.toString());
    }
}
編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。