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

Splnilo to mé očekávání si zopakovat základy Spring framework. Je vidět že školení je dobře připravené, že tomu co školíte rozumíte, že vás to baví, vysvětlíte principy a je dobře

Petr

Díky za školenie. Rád som si to celé zopakoval a rozšíril povedomie o Stream API a možnostiach funkcionálneho programovania v Jave. Veľmi dobrý impulz začať prvky funkcionálneho programovania zavádzať

Anton

Nebyl problém, se kdykoliv na cokoliv zeptat, pokud nebylo něco jasné, nebo neco nefungovalo. Také upozornění na obvyklé chyby, které nejsou hned intuitivně jasné, jako "pořadí" zpracováni Streamu, jsem ocenil.

Marek


Novinky

22.3.2019: Termíny Java školení léto 2019
Nové termíny!!!

22.3.2019: Vyšla Java 12!
Java 12 je venku!!!

20.2.2019: JIB 1.0