一個輕量級但功能強大的物件對映和 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 特定支援:
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 一起使用,以利用編譯時產生的屬性。建立類型安全的查詢並避免難以維護、容易出錯的字串連接查詢。
您可以使用註解在模型中定義一對一、一對多、多對一和多對多關係。關係可以雙向引導。許多類型關係可以載入到標準 java 集合物件中或更高效的 Result 類型中。從結果輕鬆建立流、RxJava Observable、迭代器、列表或映射。
可以自動產生多對多聯結表。此外,關係模型在編譯時進行驗證,消除了執行時間錯誤。
requery 提供了一組用於持久化和執行查詢的現代介面。 requery 和 JPA 提供者(例如 Hibernate 或 EclipseLink)之間的一些關鍵差異:
CriteriaQuery
API。專為 Android 支援而設計。有關使用資料綁定和基於介面的實體的範例 Android 項目,請參閱 requery-android/example。有關更多信息,請參閱 Android 頁面。
在一些最受歡迎的資料庫上進行了測試:
支援映射到重新查詢註釋的 JPA 註釋子集。請參閱此處以了解更多資訊。
更新插入是使用適當的資料庫特定查詢語句產生的:
merge into when matched/not matched
on conflict do update
(需要 9.5 或更高版本)on duplicate key update
bintray jcenter / mavencentral 上提供了版本。
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.