play framework個人メモ

#初期設定
###**application.confファイル**
```java
//dbに以下を追加(初期はh2になっているのでそこを書き換える)
  default.driver = org.postgresql.Driver
  default.url = "jdbc:postgresql://localhost:5433/projectName"
  default.username = postgres
  default.password = postgres

//最後の行に下を追加
ebean.default="models.*"
```


###**plugins.sbt**
```java
//一番最後の行に下記を追加
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")

//また、初期では以下がコメントに設定されているのでコメントを消す
addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "3.0.2")
```

###**build.sbt**
```java
lazy val root = (project in file(".")).enablePlugins(PlayJava)を
lazy val root = (project in file(".")).enablePlugins(PlayJava, PlayEbean)にする

//最後の行に以下を追加
libraryDependencies += "org.postgresql" % "postgresql" % "42.0.0.jre7"
EclipseKeys.preTasks := Seq(compile in Compile)
EclipseKeys.projectFlavor := EclipseProjectFlavor.Java
EclipseKeys.createSrc := EclipseCreateSrc.ValueSet(EclipseCreateSrc.ManagedClasses, EclipseCreateSrc.ManagedResources)
```

#**cache**
```java:Controller.java
//DI
@Inject
private CacheApi cache;

// キャッシュをセット（文字列じゃないオブジェクトをセットできる）
cache.set("key", item);
// 15分間だけ有効期限をつけてキャッシュをセット
cache.set("key", item, 60 * 15);
// キャッシュを取得
Item item = (Item) cache.get("key");
// キャッシュを削除
cache.remove("key");
```

#**session**
Stringしか入れられない点に注意

```java:Controller.java
// sessionに値をセット
session("email", "user@user.co.jp");
// sessionにセットした値を取得
String user = session("email");
// sessionの値をクリア
session().remove("email");
```
```html:index.html
<!-- htmlでの値の取り出し方 -->
@session.get("email");

<!-- hiddenに埋め込み -->
<input type="hidden" value="@session.get("id")" id = "idInHidden">
```

#**レンダリング**
```java
return ok(views.html.(htmlのファイル名).render();
```
#**redirect**
```java
return redirect("/item/");
```

#**バリデーション**
```java:RegisterForm.java
@Required(message = "Enter your email")
private String email;
```

```html:index.html
@if(form.error("email") != null) {
      <span style="color: red">
        @form.error("email").message()
       </span>
}
```
#**finder**
finderを使う場合はmodelクラスに以下を追加

```java:Item.java
package models;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "items")
public class Item extends Model {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Integer id;
  private String name;
  private String brand;
  private Integer category;
  private double price;

  public static Finder<Integer, Item> finder = new Finder<Integer, Item>(Integer.class, Item.class);

  //以下getter, setter
}
```
```java:ItemService.java
public List<Item> getBrandByGrandChildId(String grandChildId){
  Integer id = Integer.parseInt(grandChildId);
  List<Item> brandList = Item.finder.select("brand").where().eq("category", id).ne("brand", null).setDistinct(true).findList();
  return brandList;

//eq(フィールド, 値);    「フィールド = 値」のレコードを検索する
//ne(フィールド, 値);    「フィールド != 値」のレコードを検索する
//lt(フィールド, 値);    「フィールド < 値」のレコードを検索する
//gt(フィールド, 値);    「フィールド > 値」のレコードを検索する
//le(フィールド, 値);    「フィールド <= 値」のレコードを検索する
//ge(フィールド, 値);    「フィールド>= 値」のレコードを検索する
//ilike(フィールド, 値); 「フィールド like 値」のレコードを検索する
}
```


#**生SQL**
```java:itemService.java
public Item findById(Integer id) {
  String sql = "select * from items where a.id = ?";
  SqlRow sqlRow = Ebean.createSqlQuery(sql).setParameter(1, id).findUnique();
  return sqlRow
}
```