رسم خرائط كائنات خفيف ولكنه قوي ومولد 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 أو العناصر المتكررة البسيطة. (المجموعات والقوائم مدعومة)
@ 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 باستخدام مراجع الخصائص ووظائف infix:
data {
val result = select( Person :: class ) where ( Person ::age gt 21 ) and ( Person ::name eq " Bob " ) limit 10
}
تدفقات جافا 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 القياسيين.
تعمل الفئات المترجمة مع واجهة برمجة تطبيقات الاستعلام للاستفادة من السمات التي تم إنشاؤها في وقت الترجمة. قم بإنشاء استعلامات آمنة من النوع وتجنب الاستعلامات المتسلسلة التي يصعب صيانتها والمعرضة للخطأ.
يمكنك تحديد علاقات واحد إلى واحد، وواحد إلى متعدد، ومن متعدد إلى واحد، ومن متعدد إلى متعدد في نماذجك باستخدام التعليقات التوضيحية. يمكن التنقل في العلاقات في كلا الاتجاهين. يمكن تحميل العديد من علاقات النوع في كائنات مجموعة جافا القياسية أو في نوع نتيجة أكثر كفاءة. من إحدى النتائج، يمكنك بسهولة إنشاء Stream أو RxJava Observable أو Iterator أو List أو Map.
يمكن إنشاء جداول الوصلات من متعدد إلى متعدد تلقائيًا. بالإضافة إلى ذلك، يتم التحقق من صحة نموذج العلاقة في وقت الترجمة والقضاء على أخطاء وقت التشغيل.
يوفر requery مجموعة حديثة من الواجهات للاستمرار وتنفيذ الاستعلامات. بعض الاختلافات الرئيسية بين موفري طلبات إعادة الاستعلام وJPA مثل Hibernate أو EclipseLink:
CriteriaQuery
المطولة.تم تصميمه خصيصًا مع وضع دعم Android في الاعتبار. راجع requery-android/example للحصول على مثال لمشروع Android باستخدام ربط البيانات والكيانات القائمة على الواجهة. لمزيد من المعلومات، راجع صفحة 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 '
}
للحصول على معلومات حول معالجة التدرج والتعليقات التوضيحية، راجع 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.