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)
式を組み合わせることで、store
、code
、sku
のすべてのプロパティを網羅した完全な自然キーを定義しました。
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();