Легкое, но мощное сопоставление объектов и генератор 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, 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 это означает, что вы получаете примерно такую же производительность чтения объектов из запроса, как если бы он был заполнен с использованием стандартного API Cursor и ContentValues.
Скомпилированные классы работают с API запросов, чтобы использовать преимущества атрибутов, созданных во время компиляции. Создавайте типобезопасные запросы и избегайте сложных в обслуживании и подверженных ошибкам объединенных строковых запросов.
Вы можете определить в своих моделях отношения «один-к-одному», «один-ко-многим», «многие-к-одному» и «многие-ко-многим», используя аннотации. Отношения могут развиваться в обоих направлениях. Отношения многих типов могут быть загружены в стандартные объекты коллекции Java или в более эффективный тип Result. Из результата легко создать поток, RxJava Observable, итератор, список или карту.
Таблицы соединения «многие ко многим» могут создаваться автоматически. Кроме того, модель отношений проверяется во время компиляции, исключая ошибки времени выполнения.
requery предоставляет современный набор интерфейсов для сохранения и выполнения запросов. Некоторые ключевые различия между поставщиками 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 '
}
Информацию о gradle, обработке аннотаций и gradle см. в вики.
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.