Úvod do Jinq s jarou

1. Úvod

Jinq poskytuje intuitívny a praktický prístup k dotazovaniu na databázy v Jave. V tomto výučbe to preskúmame ako nakonfigurovať jarný projekt na použitie Jinq a niektoré z jeho funkcií ilustrované na jednoduchých príkladoch.

2. Maven závislosti

Budeme musieť pridať závislosť Jinq do pom.xml spis:

 org.jinq jinq-jpa 1.8.22 

Na jar pridáme jarnú závislosť ORM do súboru pom.xml spis:

 org.springframework spring-orm 5.2.5.RELEASE 

Nakoniec na testovanie použijeme databázu H2 v pamäti, pridajme teda spolu aj túto závislosť spring-boot-starter-data-jpa do súboru pom.xml:

 com.h2database h2 1.4.200 org.springframework.boot spring-boot-starter-data-jpa 2.2.6.RELEASE 

3. Pochopenie Jinq

Jinq nám pomáha písať jednoduchšie a čitateľnejšie databázové dotazy vystavením plynulého rozhrania API, ktoré je interne založené na rozhranie Java Stream API.

Pozrime sa na príklad, kde filtrujeme autá podľa modelu:

jinqDataProvider.streamAll (entityManager, Car.class) .where (c -> c.getModel (). equals (model)) .toList ();

Jinq efektívnym spôsobom prevádza vyššie uvedený úryvok kódu do dotazu SQL, takže konečný dopyt v tomto príklade bude:

vyberte c. * z auta c, kde c.model =?

Pretože na písanie dotazov nepoužívame obyčajný text a namiesto nich používame typovo bezpečné API, je tento prístup menej náchylný na chyby.

Cieľom spoločnosti Jinq je navyše umožniť rýchlejší vývoj pomocou bežných a ľahko čitateľných výrazov.

Napriek tomu má určité obmedzenia v počte typov a operácií, ktoré môžeme použiť, ako uvidíme ďalej.

3.1. Obmedzenia

Jinq podporuje iba základné typy v JPA a konkrétny zoznam funkcií SQL. Funguje to tak, že sa operácie lambda prevedú do natívneho dotazu SQL mapovaním všetkých objektov a metód do dátového typu JPA a funkcie SQL.

Preto nemôžeme očakávať, že nástroj preloží každý vlastný typ alebo všetky metódy daného typu.

3.2. Podporované dátové typy

Pozrime sa na podporované typy údajov a podporované metódy:

  • Stringrovná sa (), porovnať s() iba metódy
  • Primitívne dátové typy - aritmetické operácie
  • Enums a vlastné triedy - podporuje iba operácie == a! =
  • java.util.Collection - obsahuje ()
  • Dátum API - rovná sa (), pred (), po () iba metódy

Poznámka: Ak by sme chceli prispôsobiť konverziu z objektu Java na objekt databázy, museli by sme zaregistrovať našu konkrétnu implementáciu AttributeConverter v Jinq.

4. Integrácia Jinq s jarou

Jinq potrebuje EntityManager napríklad na získanie kontextu vytrvalosti. V tomto tutoriále predstavíme jednoduchý prístup k Springu, aby Jinq pracoval s EntityManager poskytuje Hibernate.

4.1. Rozhranie úložiska

Jar používa na správu entít koncept úložísk. Pozrime sa na našu Úložisko automobilov rozhranie, kde máme metódu na získanie a Auto pre daný model:

verejné rozhranie CarRepository {Voliteľné findByModel (reťazcový model); }

4.2. Abstraktné základné úložisko

Ďalšie, budeme potrebovať základné úložisko poskytnúť všetky schopnosti Jinq:

verejná abstraktná trieda BaseJinqRepositoryImpl {@Autowired private JinqJPAStreamProvider jinqDataProvider; @PersistenceContext private EntityManager entityManager; chránený abstrakt Trieda entityType (); public JPAJinqStream stream () {return streamOf (entityType ()); } chránený JPAJinqStream streamOf (Class clazz) {return jinqDataProvider.streamAll (entityManager, clazz); }}

4.3. Implementácia úložiska

Všetko, čo pre Jinq potrebujeme, je EntityManager inštancia a trieda typu entity.

Pozrime sa na Auto implementácia úložiska pomocou nášho základného úložiska Jinq, ktoré sme práve definovali:

@Repository public class CarRepositoryImpl rozširuje BaseJinqRepositoryImpl implementuje CarRepository {@Override public Voliteľné findByModel (reťazcový model) {return stream () .where (c -> c.getModel (). Equals (model)) .findFirst (); } @Override chránená trieda entityType () {návrat Car.class; }}

4.4. Zapojenie Poskytovateľ JinqJPAStream

Za účelom drôtovania Poskytovateľ JinqJPAStream napríklad, budeme pridať konfiguráciu poskytovateľa Jinq:

@Configuration verejná trieda JinqProviderConfiguration {@Bean @Autowired JinqJPAStreamProvider jinqProvider (EntityManagerFactory emf) {vrátiť nový JinqJPAStreamProvider (emf); }}

4.5. Konfigurácia jarnej aplikácie

Posledným krokom je nakonfigurujte našu jarnú aplikáciu pomocou režimu dlhodobého spánku a našej konfigurácie Jinq. Ako referenciu nájdete naše application.properties súbor, v ktorom ako databázu používame inštanciu H2 v pamäti:

spring.datasource.url = jdbc: h2: ~ / jinq spring.datasource.username = sa spring.datasource.password = spring.jpa.hibernate.ddl-auto = create-drop

5. Sprievodca dopytmi

Jinq poskytuje mnoho intuitívnych možností na prispôsobenie finálneho dotazu SQL vyberte, kdepripája sa a ďalšie. Upozorňujeme, že majú rovnaké obmedzenia, ktoré sme už uviedli vyššie.

5.1. Kde

The kde doložka umožňuje použitie viacerých filtrov na zber údajov.

V nasledujúcom príklade chceme filtrovať autá podľa modelu a popisu:

stream () .where (c -> c.getModel (). equals (model) && c.getDescription (). contains (desc)) .toList ();

A toto je SQL, ktorý Jinq prekladá:

vyberte c.model, c.popis z auta c kde c.model =? a vyhľadajte (?, popis c)> 0

5.2. Vyberte

V prípade, že chceme z databázy načítať iba niekoľko stĺpcov / polí, musíme použiť vyberte doložka.

Aby bolo možné mapovať viac hodnôt, Jinq poskytuje množstvo Násobný triedy až s ôsmimi hodnotami:

stream () .select (c -> nový Tuple3 (c.getModel (), c.getYear (), c.getEngine ())) .toList ()

A preložený SQL:

vyberte c.model, c.rok, c.motor z auta c

5.3. Pripája sa

Jinq je schopný vyriešiť vzájomné vzťahy medzi dvoma a viacerými ak sú subjekty správne prepojené.

Napríklad, ak pridáme entitu výrobcu do Auto:

@Entity (name = "CAR") verejná trieda Car {// ... @OneToOne @JoinColumn (name = "name") public Manufacturer getManufacturer () {návrat výrobcu; }}

A Výrobca subjekt so zoznamom Autos:

@Entity (name = "MANUFACTURER") verejná trieda Výrobca {// ... @OneToMany (mappedBy = "model") verejný zoznam getCars () {návratové vozidlá; }}

Teraz sme schopní získať Výrobca pre daný model:

Voliteľný výrobca = stream () .where (c -> c.getModel (). Equals (model)) .select (c -> c.getManufacturer ()) .findFirst ();

Podľa očakávania, Jinq použije klauzulu SQL s vnútorným spojením v tomto scenári:

vyberte m.name, m.city z auta c výrobca vnútorného spojenia m na c.name = m.name kde c.model =?

V prípade, že potrebujeme mať väčšiu kontrolu nad pripojiť sa klauzuly, aby sme mohli implementovať zložitejšie vzťahy nad entitami, ako napríklad vzťah typu „mnoho proti mnohým“, môžeme použiť pripojiť sa metóda:

Zoznam list = streamOf (Manufacturer.class) .join (m -> JinqStream.from (m.getCars ())) .toList ()

Nakoniec by sme mohli použiť ľavú vonkajšiu spojovaciu doložku SQL pomocou leftOuterJoin metóda namiesto pripojiť sa metóda.

5.4. Agregácie

Všetky príklady, ktoré sme doteraz uviedli, používajú buď listovať alebo findFirst metódy - vrátiť konečný výsledok nášho dotazu v Jinq.

Okrem týchto metód máme tiež prístup k iným metódam agregácie výsledkov.

Použime napríklad počítať metóda na získanie celkového počtu automobilov pre konkrétny model v našej databáze:

long total = stream () .where (c -> c.getModel (). equals (model)) .count ()

A konečný SQL používa počítať Metóda SQL podľa očakávania:

vyberte počet (c.model) z auta c, kde c.model =?

Jinq taktiež poskytuje agregačné metódy ako súčet, priemer, min, max, a možnosť kombinovať rôzne agregácie.

5.5. Stránkovanie

V prípade, že chceme načítať dáta po dávkach, môžeme použiť limit a preskočiť metódy.

Pozrime sa na príklad, kde chceme preskočiť prvých 10 automobilov a získať iba 20 položiek:

stream () .skip (10) .limit (20) .toList ()

A vygenerovaný SQL je:

vyberte c. * z limitu vozidla c? offset?

6. Záver

Ideme na to. V tomto článku sme videli prístup k nastaveniu jarnej aplikácie s Jinq pomocou režimu dlhodobého spánku (minimálne).

Stručne sme tiež preskúmali výhody spoločnosti Jinq a niektoré z jej hlavných funkcií.

Ako vždy, zdroje nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found