Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SQLファイルでUPDATE文のSET句を自動生成 #75

Merged
merged 2 commits into from
May 22, 2015
Merged

Conversation

nakamura-to
Copy link
Member

UPDATE文のWHERE句を手書きしたいがSET句は自動設定したいという要望に応える機能です。
次のように記述できます。

@Entity
class Person {
  @Id
  Integer id;
  String name;
  Integer age;
  @Version
  Integer version;
}
@Dao
interface PersonDao {
  @Update(sqlFile = true)
  int update(Person person, int age);
}
// SQLファイル PersonDao/update.sql
update person set /*%populate */ id = id where age < /* age */0
// 上記SQLファイルに対応するPreparedStatement
update person set name = ?, age = ?, version = ? + 1 where age < ?

この機能のポイントは次のものです。

  • SQLファイル内の /*%populate */ からWHERE句までが自動で置き換えられる
    • pupulate ではなく values というキーワードを使う案もあったが、式コメント内ではSQLの文脈と異なるキーワードを使ったほうがわかりやすいと判断
  • SET句の生成結果は @Update(sqlFile = false) のときと全く同じ
    • IDは含めない
    • VERSIONはインクリメントする
    • @UpdateignoreVersionsuppressOptimisticLockException 等の要素も有効
  • Daoメソッドの第一引数はエンティティクラスでなければいけない
    • エンティティクラスのプロパティがSET句に展開される
    • 第二引数以降は任意の型を指定でき、その引数はSQLファイルの式コメントから参照できる
  • /*%populate */@Update(sqlFile = true) のときだけでなく @BatchUpdate(sqlFile = true) のときも使える

UPDATE文のWHERE句を手書きしたいがSET句は自動設定したいという要望に応える機能です。
次のように記述できます。

```java
@entity
class Person {
  @id
  Integer id;
  String name;
  Integer age;
  @Version
  Integer version;
}
```

```java
@dao
interface PersonDao {
  @update(sqlFile = true)
  int update(Person person, int age);
}
```

```sql
// SQLファイル PersonDao/update.sql
update person set /*%populate */ id = id where age < /* age */0
```

```sql
// 上記SQLファイルに対応するPreparedStatement
update person set name = ?, age = ?, version = ? + 1 where age < ?
```

この機能のポイントは次のものです。

- SQLファイル内の `/*%populate */` からWHERE句までが自動で置き換えられる
  - `pupulate` ではなく `values` というキーワードを使う案もあったが、式コメント内ではSQLの文脈と異なるキーワードを使ったほうがわかりやすいと判断
- SET句の生成結果は `@Update(sqlFile = false)` のときと全く同じ
  - IDは含めない
  - VERSIONはインクリメントする
  - `@Update` の `ignoreVersion` や `suppressOptimisticLockException` 等の要素も有効
- Daoメソッドの第一引数はエンティティクラスでなければいけない
  - エンティティクラスのプロパティがSET句に展開される
  - 第二引数以降は任意の型を指定でき、その引数はSQLファイルの式コメントから参照できる
- `/*%populate */` は `@Update(sqlFile = true)` のときだけでなく `@BatchUpdate(sqlFile = true)` のときも使える
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant