raw()

Raw式を使用すると、クエリのWhere句でデータベース固有の関数または式を使用できます。

// e.g. use a database function
.raw("add_days(orderDate, 10) < ?", someDate)


// e.g. subquery
.raw("customer.id in (select o.customer_id from orders o where o.id in (?1))", orderIds);

 


便利な式

これらは、他の単純な式を組み合わせた式です。 アプリケーションで頻繁に使用されるため、用意されています。

inRange()

property >= value1 and property < value2

.orderDate.inRange(today.minusDays(7), today)

InRange式はBETWEENに似ていますが、「半開区間」です。 プロパティは、以下であるのではなく、上限値よりも厳密に小さいです。

これにより、inRangeはタイムスタンプや日付などに間隔を定義するのにより実用的になります。

inRangeWith()

property <= ? and ( highProperty > ? or highProperty is null)

.startDate.inRangeWith(endDate, asAt)

これは、開始日と終了日などの2つのプロパティが範囲を形成する「有効な日付」または「有効な範囲」に最もよく使用されます。

inOrEmpty()

これは「条件付きIN」で、コレクションが空でない場合にのみIN式が追加されます。

List<Long> customerIds = ...

// only add the expression if the customerIds is not empty
.customer.id.inOrEmpty(customerIds)

上記は、customerIdsコレクションがnullではなく、空でない場合にのみIN式を追加します。

rawOrEmpty()

これは「条件付きraw式」で、raw式はコレクション(rawサブクエリ式など)を使用し、コレクションが空でない場合にのみ式を追加します。

List<String> names = ...

// only add the expression if the names is not empty
.rawOrEmpty("customer.id in (select c.id from customer c where c.name in (?1))", names)

 


単純な式

以下の式は単純な式です。

isNull()

関連付けられたmanyプロパティのIsNullは、isEmpty()に変換されます。

new QOrder()
  .lines.isNull()
  .findList();
select ...
from orders t0
where not exists (select 1 from order_lines x where x.order_id = t0.id)

isEmpty()

IsEmpty式は、ToManyプロパティで使用してください。 isEmpty式を実装するには、SQLのexistsサブクエリが使用されます。

new QOrder()
  .lines.isEmpty()
  .findList();
select ...
from orders t0
where not exists (select 1 from order_lines x where x.order_id = t0.id)

in()

new QOrder()
  .status.in(Order.Status.NEW, Order.Status.PENDING)
  .findList();

inPairs()

inPairs() は、3つ以上のプロパティを持つ複合自然キーがあり、自然キーを提供するeq式とin式を組み合わせたクエリがある場合に使用されます(自然キーを構成するすべてのプロパティをまとめてカバーします)。

@Cache(naturalKey = {"store","code","sku"})
@Entity
public class ProductRange {
  ...
}

.store.eq("myStoreCode")式と.inPairs(pairs)式を組み合わせることで、storecodeskuのすべてのプロパティを網羅した完全な自然キーを定義しました。

Pairs pairs = new Pairs("sku", "code")
  .add("S2", 1000)
  .add("S2", 1001)
  .add("S3", 1000);

new QProductRange()
    .store.eq("myStoreCode")
    .inPairs(pairs)
    .setBeanCacheMode(CacheMode.ON)
    .order("sku desc")
    .findList();

in句に2つのプロパティがある場合はinPairsを使用します。 代わりに、2つのプロパティを持つeq式がある場合、in句には通常の単一プロパティが含まれます。

例えば

new QProductRange()
    .store.eq("myStoreCode")
    .code.eq(1004)
    .in("S2", "S3", "S4")
    .setBeanCacheMode(CacheMode.ON)
    .order("sku desc")
    .findList();

上記のクエリでは、一意の自然キーを生成するために組み合わせたeq式とin式があります。 Ebeanはこのクエリに対してL2自然キーキャッシュにヒットできます。

like

likeでは、SQLの%_プレースホルダー文字を使用して、varcharプロパティを照合します。

List<Contact> contacts =
  new QContact()
    .firstName.like("Rob%")
    .findList();

ilike - 大文字と小文字を区別しないlike

ilikeでは、SQLの%_プレースホルダー文字を使用して、varcharプロパティを照合します。

List<Contact> contacts =
  new QContact()
    .firstName.ilike("Rob%")
    .findList();

startsWith

List<Contact> contacts =
  new QContact()
    .firstName.startsWith("Rob")
    .findList();

istartsWith - 大文字と小文字を区別しないstartsWith

List<Contact> contacts =
  new QContact()
    .firstName.istartsWith("Rob")
    .findList();

endsWith

List<Contact> contacts =
  new QContact()
    .email.endsWith("@foo.com")
    .findList();

iendsWith - 大文字と小文字を区別しないendsWith

List<Contact> contacts =
  new QContact()
    .email.iendsWith("@foo.com")
    .findList();

contains

List<Contact> contacts =
  new QContact()
    .email.contains("ob")
    .findList();

eq - 等しい

List<Order> orders =
  new QOrder()
    .status.eq(Order.Status.NEW)
    .findList();

ieq - 大文字と小文字を区別しない等しい

List<Customer> orders =
  new QCustomer()
    .name.ieq("rob")
    .findList();

ne - 等しくない

List<Order> orders =
  new QOrder()
    .status.ne(Order.Status.NEW)
    .findList();

gt - より大きい

List<Order> orders =
  new QOrder()
    .whenCreated.gt(LocalDate.now().minusDays(7))
    .findList();

ge - 以上

List<Order> orders =
  new QOrder()
    .whenCreated.ge(LocalDate.now().minusDays(7))
    .findList();

lt - より小さい

List<Order> orders =
  new QOrder()
    .lines.orderQuantity.lt(10)
    .findList();

le - 以下

List<Order> orders =
  new QOrder()
    .lines.orderQuantity.le(10)
    .findList();

between

List<Order> orders =
  new QOrder()
    .orderDate.between(firstDay, lastDay)
    .findList();

betweenProperties

値が2つのプロパティの間にある場合。

Timestamp timestamp = new Timestamp(System.currentTimeMillis());
 ...
 .where().betweenProperties("effectiveStart", "effectiveEnd", timestamp)

bitwiseAny

flags.bitwiseAny(BwFlags.HAS_BULK + BwFlags.HAS_SIZE)

bitwiseAnd

int selectedFlags = BwFlags.HAS_BULK + BwFlags.HAS_SIZE;
int mask = BwFlags.HAS_SIZE; // Only Size flag set

bitwiseAnd(selectedFlags, mask)

bitwiseAll

flags.bitwiseAll(BwFlags.HAS_BULK + BwFlags.HAS_COLOUR)

bitwiseNot

flags.bitwiseNot(BwFlags.HAS_COLOUR)

以下の式は@DbArray用です。 これらの例では、連絡先のphoneNumbersは@DbArrayです。

arrayContains

new QContact()
 .phoneNumbers.contains("4321")
 .findList();

arrayNotContains

new QContact()
 .phoneNumbers.notContains("4321")
 .findList();

arrayIsEmpty

new QContact()
 .phoneNumbers.isEmpty()
 .findList();

arrayIsNotEmpty

new QContact()
 .phoneNumbers.isNotEmpty()
 .findList();