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

Velmi se mi líbila přátelská a neformální atmosféra a viditelné nadšení a zapojení přednášejícího do problematiky a tudíž skutečně zajímavé příklady z praxe a možnost zeptat se prakticky na jakoukoliv

Ondřej

Školení se mi moc líbilo, použití novinek v javě na konkrétních případech použití a vždy srozumitelně vysvětleno. Školitel má převyšující kvalifikaci a dokáže informace správnou formou předávat dál. Moc se

Robin

Pro mě jako správce aplikace, která běží na Tomcat byla velmi přínosná část architektury a monitoringu. Tato část byla vysvětlena velmi dobře i s názornými ukázkami. Byly předvedeny nástroje

Marek


Novinky

26.9.2017: RebelLabs Developer Productivity Report 2017
Další rok, další RebelLabs report :-)

14.9.2017: Java release cycle zrychluje & Java Flight Recorder zdarma
Dlouhé mnohaleté prodlevy mezi jednotlivými major releasy v Javě končí!

14.9.2017: Java EE se stěhuje do nadace Eclipse Foundation
Co to znamená?