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

Školení bylo vážně skvělé. Nejsem začátečník, se Spring Bootem dělám už rok a tak jsem se bál, že mi školení nic nedá. Školení mi ale dalo to, že všechny střípky

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


Novinky

18.10.2018: JVM Ecosystem Report 2018
Statistik není nikdy málo, tentokrát ohledně obecných technologií, které se používají v Java světě.

26.9.2018: Java Mission Control (JMC) Build
Java 11 kompatibilní JMC build

15.9.2018: Nastavení GZIP komprese, HTTP/2, cachování statických stránek a HTTPS ve Spring Boot serveru
Jak nakonfigurovat Spring Boot server tak, aby byl production-ready?