RxJava 및 Java 8을 지원하는 Java/Kotlin/Android용 가볍지만 강력한 객체 매핑 및 SQL 생성기입니다. 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 ();
}
(불변 유형을 사용할 때는 일부 기능을 사용할 수 없습니다. 여기를 참조하세요)
쿼리: SQL에 매핑되는 dsl 기반 쿼리
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
}
자바 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 유형에 로드할 수 있습니다. 결과에서 Stream, RxJava Observable, Iterator, List 또는 Map을 쉽게 생성할 수 있습니다.
다대다 접합 테이블을 자동으로 생성할 수 있습니다. 또한 관계 모델은 런타임 오류를 제거하기 위해 컴파일 타임에 검증됩니다.
requery는 쿼리를 유지하고 수행하기 위한 최신 인터페이스 세트를 제공합니다. 재쿼리와 Hibernate 또는 EclipseLink와 같은 JPA 제공자 간의 몇 가지 주요 차이점은 다음과 같습니다.
CriteriaQuery
API와 달리 DSL을 통해 동적 쿼리를 쉽게 수행할 수 있습니다.Android 지원을 염두에 두고 특별히 설계되었습니다. 데이터 바인딩 및 인터페이스 기반 엔터티를 사용하는 Android 프로젝트 예시는 requery-android/example을 참조하세요. 자세한 내용은 Android 페이지를 참조하세요.
가장 널리 사용되는 일부 데이터베이스에서 테스트되었습니다.
재쿼리 주석에 매핑되는 JPA 주석의 하위 집합이 지원됩니다. 자세한 내용은 여기를 참조하세요.
Upsert는 적절한 데이터베이스별 쿼리 문을 사용하여 생성됩니다.
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에 대한 자세한 내용은 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.