SQL クエリ

場合によっては、エンティティビーンまたは DTO ビーンを使用せず、代わりに SqlRow オブジェクトを生成または JDBC ResultSet から直接読み取る SQL クエリを実行することが有効な場合があります。

最近の一般的なアプリケーションでは、クエリのおよそ 2% が SqlQuery タイプのクエリでした。

SqlQuery と SqlRow

SqlQuery を使用すると、Ebean にデータベースプラットフォームに適切な limit/offset 句を追加でき、マッピングされたすべてのタイプ (Enum、java.time、配列タイプなど) を使用してパラメータをバインドできます。

詳細については、ドキュメント / クエリ / sqlquery を参照してください。

String sql = "select id, name, when_active from customer where status = ?";

List<SqlRow> rows = DB.sqlQuery(sql)
  .setParameter(1, "NEW")
  .setMaxRows(100)
  .findList();

for (SqlRow sqlRow : rows) {
  Long id = row.getLong("id")
  String name = row.getString("name")
  Timestamp whenActivated = row.getTimestamp("when_activated")
}

  
val sql = """
  select id, name, when_activated
  from customer
  where name like ?
""".trimIndent()

val rows = DB.sqlQuery(sql)
  .setParameter(1, "Rob%")
  .setMaxRows(100)
  .findList()

for (row in rows) {
  val id = row.getLong("id")
  val name = row.getString("name")
  val whenActivated = row.getTimestamp("when_activated")
}

SqlQuery と RowMapper

または、RowMapper を使用して、JDBC ResultSet から読み取ることができます。

String sql = "select id, name, status from customer order by name desc";

DB.sqlQuery(sql)
  .findEachRow((resultSet, rowNum) -> {

   // read directly from ResultSet

   long id = resultSet.getLong(1);
   String name = resultSet.getString(2);

   // do something interesting with the data
 });
val sql = "select id, name, status from customer order by name desc"

DB.sqlQuery(sql)
  .findEachRow { resultSet, rowNum ->

    // read directly from ResultSet

    val id = resultSet.getLong(1)
    val name = resultSet.getString(2)

    // do something interesting with the data
  }