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
}