ORM クエリ
ORM クエリには、いくつかの形式があります。クエリの詳細については、ドキュメント / クエリ をご覧ください。
「純粋な」ORM クエリ
次に、純粋な ORM クエリの例を示します。明示的に SQL 関数を指定せず、すべての SQL が生成されます。
最新の一般的なアプリケーションでは、クエリの約 85%
が「純粋な」ORM クエリでした。
Customer rob =
new QCustomer()
.name.equalTo("Rob")
.findOne();
List<Customer> customers =
new QCustomer()
.status.equalTo(Status.NEW)
.billingAddress.city.equalTo("Auckland")
.findList();
val rob =
QCustomer()
.name.equalTo("Rob")
.findOne()
val customers =
QCustomer()
.status.equalTo(Status.NEW)
.billingAddress.city.equalTo("Auckland")
.findList()
Select に SQL を含む ORM クエリ
select 句で SQL を使用できます。このタイプのクエリには、以下のような例があります。
// using sql functions in the select clause
List<String> names =
new QContact()
.select("concat(lastName,', ',firstName)")
.lastName.startsWith("A")
.findSingleAttributeList();
BigDecimal routeDistance =
new QTrip()
.select("ST_Distance(ST_StartPoint(route), ST_EndPoint(route))::BigDecimal")
.id.equalTo(tripId)
.findSingleAttribute();
// using sql functions in the select clause
var names: List<String> =
QContact()
.select("concat(lastName,' ',firstName)")
.lastName.startsWith("A")
.findSingleAttributeList()
val routeDistance: BigDecimal =
QTrip()
.select("ST_Distance(ST_StartPoint(route), ST_EndPoint(route))::BigDecimal")
.id.equalTo(tripId)
.findSingleAttribute()
Where に SQL を含む ORM クエリ
where 句でも SQL を使用できます。これは頻繁に、SQL サブクエリを指定する場合に使用されます。
// sql functions used in predicates
List<Order> orders =
new QOrder()
.raw("add_days(orderDate, 10) < ?", someDate)
.findList();
// SQL sub-query - often easiest to specify the subquery in sql form
String subQuery
= "t0.customer_id in " +
"(select customer_id from customer_group where group_id = any(?::uuid[]))";
List<Order> orders =
new QOrder()
.status.equalTo(Status.NEW)
.raw(subQuery, groupIds) // use raw SQL in where clause
.findList();
// sql functions used in predicates
var orders =
QOrder()
.raw("add_days(orderDate, 10) < ?", someDate)
.findList()
// SQL sub-query - often easiest to specify the subquery in sql form
val subQuery =
"t0.customer_id in " +
"(select customer_id from customer_group where group_id = any(?::uuid[]))"
var orders =
QOrder()
.status.equalTo(Status.NEW)
.raw(subQuery, groupIds) // use raw SQL in where clause
.findList()
最新の一般的なアプリケーションでは、クエリの約 5%
が何らかの SQL (主にサブクエリ) を含む ORM クエリでした。
ORM to DTO クエリ
ORM クエリを定義し、asDto
を使用して DTO クエリに変換できます。ORM を使用して SQL を生成し、それを DTO Bean に直接マッピングします。
// ContactDto is a plain bean with email and fullName properties
List<ContactDto> contacts =
new QContact()
.select("email, concat(lastName, ', ', firstName) as fullName")
.lastName.startsWith("A")
.orderBy()
.lastName.asc()
.setMaxRows(10)
.asDto(ContactDto.class)
.findList();
// ContactDto is a plain bean with email and fullName properties
val contacts =
new QContact()
.select("email, concat(lastName, ', ', firstName) as fullName")
.lastName.startsWith("A")
.orderBy()
.lastName.asc()
.setMaxRows(10)
.asDto(ContactDto::class.java)
.findList()
SQL - find native とも呼ばれます
また、SQL でクエリを指定し、(以下のように)エンティティ Bean または DTO Bean に自動的にマッピングすることもできます。
String sql = "select id, name from customer where name like ?";
Customer customer = DB.findNative(Customer.class, sql)
.setParameter(1, "Jo%")
.findOne();
String sql = "select id, name from customer where name like ?";
val customer = DB.findNative(Customer::class.java, sql)
.setParameter(1, "Jo%")
.findOne()