การแมปวัตถุที่เบาแต่ทรงพลังและตัวสร้าง SQL สำหรับ Java/Kotlin/Android พร้อมรองรับ RxJava และ Java 8 แมปหรือสร้างฐานข้อมูล ดำเนินการสืบค้นและอัปเดตจากแพลตฟอร์มใดๆ ที่ใช้ 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 ();
}
(หมายเหตุ คุณสมบัติบางอย่างจะไม่สามารถใช้ได้เมื่อใช้ประเภทที่ไม่เปลี่ยนรูป ดูที่นี่)
ข้อความค้นหา: ข้อความค้นหาที่ใช้ dsl ซึ่งแมปกับ 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 ();
ความสัมพันธ์: นำเสนอความสัมพันธ์ได้อย่างมีประสิทธิภาพมากขึ้นด้วย Java 8 Streams, RxJava Observables หรือการทำซ้ำแบบธรรมดา (sets and lists are supported to)
@ 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))
}
การสนับสนุนเฉพาะ 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 optional and time support:
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 observe query on table changes:
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 หมายความว่าคุณจะได้รับออบเจ็กต์การอ่านประสิทธิภาพที่เท่ากันจากการสืบค้นเหมือนกับว่ามีการเติมข้อมูลโดยใช้เคอร์เซอร์มาตรฐานและ ContentValues API
คลาสที่คอมไพล์แล้วทำงานร่วมกับ Query API เพื่อใช้ประโยชน์จากแอตทริบิวต์ที่สร้างเวลาคอมไพล์ สร้างประเภทการสืบค้นที่ปลอดภัยและหลีกเลี่ยงการสืบค้นที่ต่อสตริงที่ง่ายต่อการบำรุงรักษาและมีแนวโน้มที่จะเกิดข้อผิดพลาด
คุณสามารถกำหนดความสัมพันธ์แบบหนึ่งต่อหนึ่ง, หนึ่งต่อหลาย, หลายต่อหนึ่ง และหลายต่อหลายในแบบจำลองของคุณโดยใช้คำอธิบายประกอบ ความสัมพันธ์สามารถนำทางได้ทั้งสองทิศทาง ความสัมพันธ์หลายประเภทสามารถโหลดลงในออบเจ็กต์คอลเลกชัน Java มาตรฐานหรือในประเภทผลลัพธ์ที่มีประสิทธิภาพมากขึ้น จากผลลัพธ์สามารถสร้าง Stream, RxJava Observable, Iterator, List หรือ Map ได้อย่างง่ายดาย
สามารถสร้างตารางแยกหลายต่อหลายรายการได้โดยอัตโนมัติ นอกจากนี้ โมเดลความสัมพันธ์ยังได้รับการตรวจสอบ ณ เวลาคอมไพล์ ซึ่งช่วยลดข้อผิดพลาดรันไทม์อีกด้วย
requery จัดเตรียมชุดอินเทอร์เฟซที่ทันสมัยสำหรับการสืบค้นและดำเนินการสืบค้น ความแตกต่างที่สำคัญบางประการระหว่างการสืบค้นและผู้ให้บริการ JPA เช่น Hibernate หรือ EclipseLink:
CriteriaQuery
ออกแบบมาโดยเฉพาะโดยคำนึงถึงการรองรับ Android ดู requery-android/example สำหรับโครงการ Android ตัวอย่างที่ใช้ databinding และเอนทิตีที่ใช้อินเทอร์เฟซ สำหรับข้อมูลเพิ่มเติม โปรดดูที่หน้า Android
ทดสอบกับฐานข้อมูลยอดนิยมบางส่วน:
รองรับชุดย่อยของคำอธิบายประกอบ JPA ที่แม็ปไปยังคำอธิบายประกอบการสืบค้นซ้ำได้รับการสนับสนุน ดูที่นี่สำหรับข้อมูลเพิ่มเติม
Upserts ถูกสร้างขึ้นด้วยคำสั่งสืบค้นเฉพาะฐานข้อมูลที่เหมาะสม:
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 '
}
สำหรับข้อมูลเกี่ยวกับการประมวลผลการไล่ระดับและคำอธิบายประกอบและการไล่ระดับ โปรดดูที่วิกิ
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.