Jak na pokročilejší SELECTy v JPA / Hibernate

publikováno: 18.1.2016

Dostal jsem tento dotaz (který také často řeším na školeních): Jak na pokročilejší SELECTy ve Spring Data JPA / Hibernate? Moje odpověď:

Ohledně pokročilejších SELECTů je několik možností v závislosti na tom, co si představujete pod pojmem "pokročilejší":
 
POZNÁMKA: Samozřejmě pokud potřebujete pokročilé SELECTy neustále, tak může být lepší použít místo JPA myBatis nebo JOOQ.
 
  • Klasické spojování tabulek, základní skalární funkce, základní agregační funkce, group by, having i vnořené dotazy (bez klíčového slova "with"): Pomocí anotace @Query, do které se dává HQL (také známé pod zkratkou JPQL): http://docs.jboss.org/hibernate/orm/5.0/userGuide/en-US/html_single/#hql ... mimochodem jde tam taky dát SQL, kritéria (o tom dále) a nejenom SELECT, ale i UPDATE a DELETE (ve spojení s anotací @Modifying) 
  • Dynamicky tvořené SELECTy (například když potřebujeme sestavit SELECT podle toho, co uživatel naklikal ve formuláři): Do třídy s anotací @Service je možné přidat: @PersistenceContext private EntityManager entityManager a Spring dovnitř vloží instanci EntityManagera, který má metodu createQuery, do které se dává HQL / JPQL (a taky má metodu createNativeQuery, do které se dává klasické SQL): https://docs.oracle.com/javaee/6/tutorial/doc/bnbrg.html Tenhle přístup má ale tu nevýhodu, že je náchylný k chybám (protože se spojují Stringy). Proto je lepší použít Criteria nejlépe pomocí této knihovny: http://www.querydsl.com/ (což sice vyžaduje trochu víc znalostí, ale postupem času se tato časová investice vrátí).
  • Pokročilé vlastnosti SQL jako vnořené SELECTy pomocí klíčového slova WITH, analytické funkce apod. Tohle HQL / JPQL neumí a bude nutné to napsat v SQL (nejlepší to je vložit do souboru META-INF/orm.xml aby to nebylo v kódu repozitáře (SQLko má tendenci bobtnat): http://www.petrikainulainen.net/programming/spring-framework/spring-data-jpa-tutorial-creating-database-queries-with-named-queries/ (asi v polovině stránky).
  • Udělat view a namapovat ho jako entitu.

Reference

Podavane informace byly aktualni, byly vysvetlene i souvislosti, hlavne na uvod byl dobre vysvetlen kontext probiraneho tematu, teda co je co a jaky to ma vyznam. Navic bylo cele skoleni podporeno

Petr

S priebehom kurzu som bol nadmieru spokojný. Na kurze ma zaujali okrem klasickej teorie aj prakticke príklady ktoré boli podané s plnohodnotným vysvetlením. Myslím že v rámci školenia bol venovaný

František

Vazim si otvorenost lektora, ktory bol ochotny podelit sa o svoje dlhorocne znalosti a skusenosti v obore, pristup k studentom bol neformalny, co nakoniec vytvorilo vybornu atmosferu na pokladanie dotazou

Lukáš


Novinky

24.6.2018: Změny v licencování Oracle JDK
Od Java 11 (včetně) Oracle JDK bude zdarma pro vývoj a testování, ale ne pro produkční použití.

10.6.2018: Srovnání rychlosti mapovacích frameworků
Porovnání MapStruct, Dozer, Orika, ... z pohledu rychlosti

10.6.2018: JetBrains: State of Developer Ecosystem 2018
Statistika nuda NENÍ :-)