一个轻量级但功能强大的对象映射和 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.