RxJava および Java 8 をサポートする、軽量かつ強力な Java/Kotlin/Android 用のオブジェクト マッピングおよび SQL ジェネレーター。 Java を使用する任意のプラットフォームからデータベースへのマッピングやデータベースの作成、クエリや更新を簡単に実行できます。
抽象クラスからエンティティを定義します。
@ Entity
abstract class AbstractPerson {
@ Key @ Generated
int id ;
@ Index ( "name_index" ) // table specification
String name ;
@ OneToMany // relationships 1:1, 1:many, many to many
Set < Phone > phoneNumbers ;
@ Converter ( EmailToStringConverter . class ) // custom type conversion
Email email ;
@ PostLoad // lifecycle callbacks
void afterLoad () {
updatePeopleList ();
}
// getter, setters, equals & hashCode automatically generated into Person.java
}
またはインターフェースから:
@ Entity
public interface Person {
@ Key @ Generated
int getId ();
String getName ();
@ OneToMany
Set < Phone > getPhoneNumbers ();
String getEmail ();
}
または、@AutoValue によって生成されるような不変型を使用します。
@ AutoValue
@ Entity
abstract class Person {
@ AutoValue . Builder
static abstract class Builder {
abstract Builder setId ( int id );
abstract Builder setName ( String name );
abstract Builder setEmail ( String email );
abstract Person build ();
}
static Builder builder () {
return new AutoValue_Person . Builder ();
}
@ Key
abstract int getId ();
abstract String getName ();
abstract String getEmail ();
}
(不変型を使用すると一部の機能が利用できないことに注意してください。ここを参照してください)
クエリ: SQL にマップする DSL ベースのクエリ
Result < Person > query = data
. select ( Person . class )
. where ( Person . NAME . lower (). like ( "b%" )). and ( Person . AGE . gt ( 20 ))
. orderBy ( Person . AGE . desc ())
. limit ( 5 )
. get ();
関係: Java 8 Streams、RxJava Observable、または単純な反復可能オブジェクトを使用して関係をより効率的に表現します。 (セットとリストは以下のようにサポートされます)
@ Entity
abstract class AbstractPerson {
@ Key @ Generated
int id ;
@ ManyToMany
Result < Group > groups ;
// equivalent to:
// data.select(Group.class)
// .join(Group_Person.class).on(Group_ID.equal(Group_Person.GROUP_ID))
// .join(Person.class).on(Group_Person.PERSON_ID.equal(Person.ID))
// .where(Person.ID.equal(id))
}
プロパティ参照と infix 関数を使用した Kotlin 固有のサポート:
data {
val result = select( Person :: class ) where ( Person ::age gt 21 ) and ( Person ::name eq " Bob " ) limit 10
}
Java 8 ストリーム:
data . select ( Person . class )
. orderBy ( Person . AGE . desc ())
. get ()
. stream (). forEach ( System . out :: println );
Java 8 のオプションと時間のサポート:
public interface Person {
@ Key @ Generated
int getId ();
String getName ();
Optional < String > getEmail ();
ZonedDateTime getBirthday ();
}
RxJava オブザーバブル:
Observable < Person > observable = data
. select ( Person . class )
. orderBy ( Person . AGE . desc ())
. get ()
. observable ();
RxJava はテーブル変更に関するクエリを観察します。
Observable < Person > observable = data
. select ( Person . class )
. orderBy ( Person . AGE . desc ())
. get ()
. observableResult (). subscribe (:: updateFromResult );
読み取り/書き込みの分離不変型とともに、オプションでクエリ (読み取り) と更新 (書き込み) を分離します。
int rows = data . update ( Person . class )
. set ( Person . ABOUT , "student" )
. where ( Person . AGE . lt ( 21 )). get (). value ();
requery は、コンパイル時の注釈処理を使用して、エンティティ モデル クラスとマッピング属性を生成します。 Android では、これは、標準の Cursor および ContentValues API を使用してデータが設定された場合とほぼ同じパフォーマンスでクエリからオブジェクトを読み取ることを意味します。
コンパイルされたクラスはクエリ API と連携して、コンパイル時に生成された属性を利用します。タイプセーフなクエリを作成し、保守が難しくエラーが発生しやすい文字列連結クエリを回避します。
アノテーションを使用して、モデル内で 1 対 1、1 対多、多対 1、および多対多の関係を定義できます。関係は両方向にナビゲートできます。多くの型の関係は、標準の Java コレクション オブジェクトまたはより効率的な Result 型にロードできます。結果から、ストリーム、RxJava Observable、イテレータ、リスト、またはマップを簡単に作成します。
多対多のジャンクション テーブルを自動的に生成できます。さらに、関係モデルはコンパイル時に検証され、実行時エラーが排除されます。
requery は、クエリを永続化して実行するための最新のインターフェイスのセットを提供します。再クエリと Hibernate や EclipseLink などの JPA プロバイダーとの主な違いは次のとおりです。
CriteriaQuery
API とは対照的に、DSL を通じて簡単に実行できます。Android のサポートを念頭に置いて特別に設計されています。データバインディングとインターフェイスベースのエンティティを使用した Android プロジェクトの例については、requery-android/example を参照してください。詳細については、Android のページを参照してください。
最も一般的なデータベースのいくつかでテスト済み:
再クエリアノテーションにマップされる JPA アノテーションのサブセットがサポートされています。詳細については、こちらを参照してください。
Upsert は、適切なデータベース固有のクエリ ステートメントを使用して生成されます。
merge into when matched/not matched
on conflict do update
(9.5 以降が必要)on duplicate key update
バージョンは bintray jcenter / maven Central で入手できます。
repositories {
jcenter()
}
dependencies {
compile ' io.requery:requery:1.6.1 '
compile ' io.requery:requery-android:1.6.1 ' // for android
annotationProcessor ' io.requery:requery-processor:1.6.1 '
}
gradle とアノテーション処理と gradle の詳細については、wiki を参照してください。
Copyright (C) 2019 requery.io
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.