Pemetaan objek dan generator SQL yang ringan namun kuat untuk Java/Kotlin/Android dengan dukungan RxJava dan Java 8. Memetakan atau membuat database dengan mudah, melakukan kueri dan pembaruan dari platform apa pun yang menggunakan Java.
Definisikan entitas dari kelas abstrak:
@ 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
}
atau dari antarmuka:
@ Entity
public interface Person {
@ Key @ Generated
int getId ();
String getName ();
@ OneToMany
Set < Phone > getPhoneNumbers ();
String getEmail ();
}
atau gunakan tipe yang tidak dapat diubah seperti yang dihasilkan oleh @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 ();
}
(Perhatikan bahwa beberapa fitur tidak akan tersedia saat menggunakan tipe yang tidak dapat diubah, lihat di sini)
Kueri: kueri berbasis dsl yang dipetakan ke SQL
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 ();
Hubungan: mewakili hubungan secara lebih efisien dengan Java 8 Streams, RxJava Observables, atau iterable biasa. (kumpulan dan daftar didukung untuk)
@ 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))
}
Dukungan khusus Kotlin menggunakan referensi properti dan fungsi infiks:
data {
val result = select( Person :: class ) where ( Person ::age gt 21 ) and ( Person ::name eq " Bob " ) limit 10
}
Aliran Java 8:
data . select ( Person . class )
. orderBy ( Person . AGE . desc ())
. get ()
. stream (). forEach ( System . out :: println );
Dukungan opsional dan waktu Java 8:
public interface Person {
@ Key @ Generated
int getId ();
String getName ();
Optional < String > getEmail ();
ZonedDateTime getBirthday ();
}
RxJava yang Dapat Diamati:
Observable < Person > observable = data
. select ( Person . class )
. orderBy ( Person . AGE . desc ())
. get ()
. observable ();
RxJava mengamati kueri pada perubahan tabel:
Observable < Person > observable = data
. select ( Person . class )
. orderBy ( Person . AGE . desc ())
. get ()
. observableResult (). subscribe (:: updateFromResult );
Pemisahan baca/tulis Bersamaan dengan tipe yang tidak dapat diubah, pisahkan kueri secara opsional (membaca) dan pembaruan (menulis):
int rows = data . update ( Person . class )
. set ( Person . ABOUT , "student" )
. where ( Person . AGE . lt ( 21 )). get (). value ();
requery menggunakan pemrosesan anotasi waktu kompilasi untuk menghasilkan kelas model entitas dan atribut pemetaan. Di Android, hal ini berarti Anda mendapatkan performa pembacaan objek yang sama dari kueri seolah-olah objek tersebut diisi menggunakan Cursor dan ContentValues API standar.
Kelas yang dikompilasi bekerja dengan API kueri untuk memanfaatkan atribut yang dihasilkan waktu kompilasi. Buat jenis kueri yang aman dan hindari kueri gabungan string yang sulit dipelihara dan rawan kesalahan.
Anda dapat menentukan relasi Satu-ke-Satu, Satu-ke-Banyak, Banyak-ke-Satu, dan Banyak-ke-Banyak dalam model Anda menggunakan anotasi. Hubungan dapat dinavigasi dalam dua arah. Dari banyak tipe relasi yang dapat dimuat ke dalam objek koleksi Java standar atau ke dalam tipe Hasil yang lebih efisien. Dari Hasil dengan mudah membuat Stream, RxJava Observable, Iterator, List atau Map.
Tabel persimpangan Many-to-Many dapat dibuat secara otomatis. Selain itu model relasi divalidasi pada waktu kompilasi dengan menghilangkan kesalahan runtime.
requery menyediakan seperangkat antarmuka modern untuk menyimpan dan menjalankan kueri. Beberapa perbedaan utama antara requery dan penyedia JPA seperti Hibernate atau EclipseLink:
CriteriaQuery
yang bertele-tele.Dirancang khusus dengan mempertimbangkan dukungan Android. Lihat requery-android/example untuk contoh proyek Android yang menggunakan penyatuan data dan entitas berbasis antarmuka. Untuk informasi lebih lanjut lihat halaman Android.
Diuji pada beberapa database paling populer:
Subset anotasi JPA yang dipetakan ke anotasi permintaan didukung. Lihat di sini untuk informasi lebih lanjut.
Upsert dihasilkan dengan pernyataan kueri spesifik database yang sesuai:
merge into when matched/not matched
on conflict do update
(memerlukan 9.5 atau lebih baru)on duplicate key update
Versi tersedia di 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 '
}
Untuk informasi tentang pemrosesan gradle dan anotasi & gradle, lihat 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.