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()