Home
Explore
Submit Search
Upload
Login
Signup
Advertisement
Check these out next
Sane Sharding with Akka Cluster
miciek
$.get, a Prime on Data Fetching
Josh Black
Java Play RESTful ebean
Faren faren
Advanced akka features
Grzegorz Duda
Asynchronous web apps with the Play Framework 2.0
Oscar Renalias
SQLAlchemy Primer
泰 増田
Play vs Rails
Daniel Cukier
Akka Cluster in Java - JCConf 2015
Jiayun Zhou
1
of
92
Top clipped slide
Thinking Beyond ORM in JPA
Sep. 20, 2016
•
0 likes
2 likes
×
Be the first to like this
Show More
•
564 views
views
×
Total views
0
On Slideshare
0
From embeds
0
Number of embeds
0
Download Now
Download to read offline
Report
Technology
Oracle Technology Network Virtual Technology Summit
Patrycja Wegrzynowicz
Follow
Founder and CTO at Yon Labs
Advertisement
Advertisement
Advertisement
Recommended
Second Level Cache in JPA Explained
Patrycja Wegrzynowicz
4K views
•
72 slides
Thinking Beyond ORM in JPA
Patrycja Wegrzynowicz
2.6K views
•
64 slides
Lazy vs. Eager Loading Strategies in JPA 2.1
Patrycja Wegrzynowicz
4.5K views
•
66 slides
Innovation and Security in Ruby on Rails
tielefeld
297 views
•
68 slides
Jsp
Manav Prasad
457 views
•
38 slides
55 New Features in Java 7
Boulder Java User's Group
70.9K views
•
63 slides
More Related Content
Slideshows for you
(20)
Sane Sharding with Akka Cluster
miciek
•
1.5K views
$.get, a Prime on Data Fetching
Josh Black
•
179 views
Java Play RESTful ebean
Faren faren
•
2.3K views
Advanced akka features
Grzegorz Duda
•
1.5K views
Asynchronous web apps with the Play Framework 2.0
Oscar Renalias
•
8.2K views
SQLAlchemy Primer
泰 増田
•
1.5K views
Play vs Rails
Daniel Cukier
•
45.7K views
Akka Cluster in Java - JCConf 2015
Jiayun Zhou
•
4K views
Akka and the Zen of Reactive System Design
Lightbend
•
10K views
Short intro to scala and the play framework
Felipe
•
1.7K views
JSR 354 LJC-Hackday
Anatole Tresch
•
777 views
JSR 354 Hackday - What you can do...
Anatole Tresch
•
761 views
HTML5 JavaScript APIs
Remy Sharp
•
54.8K views
Find Anything In Your APEX App - Fuzzy Search with Oracle Text
Carsten Czarski
•
1.6K views
An Introduction to Solr
tomhill
•
12.7K views
JAX-RS and CDI Bike the (Reactive) Bridge
José Paumard
•
1.2K views
Behind the curtain - How Django handles a request
Daniel Hepper
•
1K views
Reactive Web-Applications @ LambdaDays
Manuel Bernhardt
•
6K views
Reporting solutions for ADF Applications
Getting value from IoT, Integration and Data Analytics
•
11.5K views
Java EE 6 CDI Integrates with Spring & JSF
Jiayun Zhou
•
3.9K views
Similar to Thinking Beyond ORM in JPA
(20)
Tweet4Beer (atualizada): Torneira de Chopp Controlada por Java, JavaFX, IoT ...
Marco Antonio Maciel
•
1.2K views
REST Enabling your Oracle Database (2018 Update)
Jeff Smith
•
3.5K views
MySQL Troubleshooting with the Performance Schema
Sveta Smirnova
•
1.5K views
2015 Java update and roadmap, JUG sevilla
Trisha Gee
•
13.1K views
AWR and ASH in an EM12c World
Kellyn Pot'Vin-Gorman
•
662 views
Kellyn Pot'Vin-Gorman - Awr and Ash
gaougorg
•
344 views
Tweet4Beer - Beertap powered by Java goes IoT and JavaFX
Bruno Borges
•
2.5K views
AWR and ASH Deep Dive
Kellyn Pot'Vin-Gorman
•
1.9K views
Java EE 7 for WebLogic 12c Developers
Bruno Borges
•
4K views
Using MySQL Enterprise Monitor for Continuous Performance Improvement
Mark Matthews
•
731 views
Interactive Java Support to your tool -- The JShell API and Architecture
JavaDayUA
•
1.1K views
MySQL-Performance Schema- What's new in MySQL-5.7 DMRs
Mayank Prasad
•
950 views
MySQL Performance Schema : fossasia
Mayank Prasad
•
2.4K views
Mysql tech day_paris_ps_and_sys
Mark Leith
•
8K views
Oracle REST Data Services: Options for your Web Services
Jeff Smith
•
14.6K views
JAX-RS.next
Michal Gajdos
•
1.5K views
20150110 my sql-performanceschema
Ivan Ma
•
520 views
Zero to Manageability in 60 Minutes: Building a Solid Foundation for Oracle E...
Courtney Llamas
•
2K views
Introdução ao Oracle NoSQL
Bruno Borges
•
1.3K views
20160821 coscup-my sql57docstorelab01
Ivan Ma
•
463 views
Advertisement
More from Patrycja Wegrzynowicz
(8)
The Hacker's Guide to Kubernetes
Patrycja Wegrzynowicz
•
115 views
The Hacker's Guide to JWT Security
Patrycja Wegrzynowicz
•
951 views
The Hacker's Guide to JWT Security
Patrycja Wegrzynowicz
•
706 views
The Hacker's Guide to XSS
Patrycja Wegrzynowicz
•
592 views
The Hacker's Guide to NoSQL Injection
Patrycja Wegrzynowicz
•
2K views
The Hacker's Guide to Session Hijacking
Patrycja Wegrzynowicz
•
887 views
The Hacker's Guide To Session Hijacking
Patrycja Wegrzynowicz
•
741 views
Secure Authentication and Session Management in Java EE
Patrycja Wegrzynowicz
•
2.8K views
Recently uploaded
(20)
Blomberg KWD2330X Service Manual.pdf
ssuser78bec11
•
0 views
proposal (2).pdf
mennaHendy
•
3 views
如何办理一份高仿伦敦南岸大学毕业证成绩单?
aazepp
•
3 views
【本科生、研究生】美国德鲁大学毕业证文凭购买指南
sutseu
•
0 views
Will AI take over our jobs .pptx
Alfredo Mancera
•
11 views
stock.ppt
ruber731
•
0 views
Networking Hardware Requirements.pptx
JhamaikaPaet
•
1 view
【本科生、研究生】英国利物浦约翰莫尔大学毕业证文凭购买指南
sutseu
•
0 views
如何办理一份高仿科克大学毕业证成绩单?
aazepp
•
3 views
Configure Network Services.pptx
YanaDangle
•
0 views
KPIs&Goals.pdf
mennaHendy
•
2 views
Azure Pizza as a Service Model
Carlo Sacchi
•
7 views
Crewlogout Overview
livestimes
•
0 views
如何办理一份高仿昆特兰理工大学毕业证成绩单?
aazepp
•
3 views
Office 365 licenses
Princy Nadar
•
0 views
ChIP-Sequencing
Hajra Qayyum
•
0 views
如何办理一份高仿东伦敦大学毕业证成绩单?
aazepp
•
3 views
如何办理一份高仿南达科他大学毕业证成绩单?
aazepp
•
3 views
Introduction to Virtualization.pptx
latifdhalait
•
0 views
Excel 2010.docx
RobertoMarcelinodaSi1
•
5 views
Advertisement
Thinking Beyond ORM in JPA
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Thinking Beyond ORM in JPA Patrycja Wegrzynowicz CTO Yonita, Inc. March 15, 2016 Please Stand By. This session will begin promptly at the time indicated on the agenda. Thank You.
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Safe Harbor Statement The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle. 2
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | About Me • 15+ professional experience – Still an active developer! • Author and speaker – JavaOne, Devoxx, JavaZone, others • Finalizing PhD in Computer Science • Founder and CTO of Yonita – Consulting plus automated tools for detection of bugs in software – Security, performance, databases • Twitter @yonlabs Oracle Confidential – Internal/Restricted/Highly Restricted 3
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Outline • Why? – App-centric vs. data-centric • What? – Use cases and performance • How? – JPA (2.1)
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Database
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Database – The Mordor of Java Developers
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Why? Different paradigms! • One size doesn’t fit all! • App-centric – Java code drives database design – One app accesses data – CRUD more often than complex queries • Data-centric – Database design drives Java code – Several apps access data – CRUD as often as complex queries
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | What? Use Cases
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | What? Performance
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Legacy Systems
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Legacy systems and Database-Level Abstraction • Legacy systems – It’s always worked that way! – Database was all we had! – We need to feed all those apps! • Abstraction – Views – Stored procedures – Triggers
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Stored Procedures in JPA • 2.0 and before – Native queries to call stored procedures – No OUT/INOUT parameters – Database dependent CALL syntax • 2.1 – EntityManager.createStoredProcedureQuery – @NamedStoredProcedureQuery
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure Result Set -- MySQL CREATE PROCEDURE GET_EMPLOYEES() BEGIN SELECT * FROM EMPLOYEES; END
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query StoredProcedureQuery q = em.createStoredProcedureQuery("GET_EMPLOYEES", Employee.class); // gather the results List<Employee> list = (List<Employee>) q.getResultList();
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query StoredProcedureQuery q = em.createStoredProcedureQuery("GET_EMPLOYEES", Employee.class); // gather the results List<Employee> list = (List<Employee>) q.getResultList();
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query StoredProcedureQuery q = em.createStoredProcedureQuery("GET_EMPLOYEES", Employee.class); // gather the results List<Employee> list = (List<Employee>) q.getResultList();
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query StoredProcedureQuery q = em.createStoredProcedureQuery("GET_EMPLOYEES", Employee.class); // gather the results, an implicit call to an execute method! List<Employee> list = (List<Employee>) q.getResultList();
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure OUT Parameter -- MySQL CREATE PROCEDURE SUM_SALARIES(OUT TOTAL INT) BEGIN SELECT SUM(SALARY) INTO TOTAL FROM EMPLOYEES; END
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query StoredProcedureQuery q = em.createStoredProcedureQuery("SUM_SALARIES"); q.registerStoredProcedureParameter("TOTAL", Integer.class, ParameterMode.OUT); // execute the query... q.execute(); // ...to obtain the output value Integer total = (Integer) q.getOutputParameterValue("TOTAL");
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query StoredProcedureQuery q = em.createStoredProcedureQuery("SUM_SALARIES"); q.registerStoredProcedureParameter("TOTAL", Integer.class, ParameterMode.OUT); // execute the query... q.execute(); // ...to obtain the output value Integer total = (Integer) q.getOutputParameterValue("TOTAL");
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query StoredProcedureQuery q = em.createStoredProcedureQuery("SUM_SALARIES"); q.registerStoredProcedureParameter("TOTAL", Integer.class, ParameterMode.OUT); // execute the query... q.execute(); // ...to obtain the output value Integer total = (Integer) q.getOutputParameterValue("TOTAL");
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query StoredProcedureQuery q = em.createStoredProcedureQuery("SUM_SALARIES"); q.registerStoredProcedureParameter("TOTAL", Integer.class, ParameterMode.OUT); // execute the query... q.execute(); // ...to obtain the output value Integer total = (Integer) q.getOutputParameterValue("TOTAL");
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure All in One -- MySQL CREATE PROCEDURE GET_EMPLOYEES( IN GIVEN_COUNTRY VARCHAR(255), OUT TOTAL INT ) BEGIN SELECT SUM(SALARY) INTO TOTAL FROM EMPLOYEES WHERE COUNTRY = GIVEN_COUNTRY; SELECT * FROM EMPLOYEES WHERE COUNTRY = GIVEN_COUNTRY; END
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query StoredProcedureQuery q = em.createStoredProcedureQuery("GET_EMPLOYEES", Employee.class); q.registerStoredProcedureParameter("COUNTRY", String.class, ParameterMode.IN); q.registerStoredProcedureParameter("TOTAL", Integer.class, ParameterMode.OUT); // setup the parameters q.setParameter("COUNTRY", "Poland"); // obtain the employees... List<Employee> list = (List<Employee>) q.getResultList(); // ...and the output value Integer total = (Integer) q.getOutputParameterValue("TOTAL");
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query StoredProcedureQuery q = em.createStoredProcedureQuery("GET_EMPLOYEES", Employee.class); q.registerStoredProcedureParameter("COUNTRY", String.class, ParameterMode.IN); q.registerStoredProcedureParameter("TOTAL", Integer.class, ParameterMode.OUT); // setup the parameters q.setParameter("COUNTRY", "Poland"); // obtain the employees... List<Employee> list = (List<Employee>) q.getResultList(); // ...and the output value Integer total = (Integer) q.getOutputParameterValue("TOTAL");
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query StoredProcedureQuery q = em.createStoredProcedureQuery("GET_EMPLOYEES", Employee.class); q.registerStoredProcedureParameter("COUNTRY", String.class, ParameterMode.IN); q.registerStoredProcedureParameter("TOTAL", Integer.class, ParameterMode.OUT); // setup the parameters q.setParameter("COUNTRY", "Poland"); // obtain the employees... List<Employee> list = (List<Employee>) q.getResultList(); // ...and the output value Integer total = (Integer) q.getOutputParameterValue("TOTAL");
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query StoredProcedureQuery q = em.createStoredProcedureQuery("GET_EMPLOYEES", Employee.class); q.registerStoredProcedureParameter("COUNTRY", String.class, ParameterMode.IN); q.registerStoredProcedureParameter("TOTAL", Integer.class, ParameterMode.OUT); // setup the parameters q.setParameter("COUNTRY", "Poland"); // obtain the employees... List<Employee> list = (List<Employee>) q.getResultList(); // ...and the output value Integer total = (Integer) q.getOutputParameterValue("TOTAL");
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query StoredProcedureQuery q = em.createStoredProcedureQuery("GET_EMPLOYEES", Employee.class); q.registerStoredProcedureParameter("COUNTRY", String.class, ParameterMode.IN); q.registerStoredProcedureParameter("TOTAL", Integer.class, ParameterMode.OUT); // setup the parameters q.setParameter("COUNTRY", "Poland"); // obtain the employees... List<Employee> list = (List<Employee>) q.getResultList(); // ...and the output value Integer total = (Integer) q.getOutputParameterValue("TOTAL");
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query StoredProcedureQuery q = em.createStoredProcedureQuery("GET_EMPLOYEES",Employee.class); q.registerStoredProcedureParameter("TOTAL", Integer.class, ParameterMode.OUT); // setup the parameters q.setParameter("COUNTRY", "Poland"); // obtain the employees List<Employee> list = (List<Employee>) q.getResultList(); // do we need the execute call here? Integer total = (Integer) q.getOutputParameterValue("TOTAL");
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query StoredProcedureQuery q = em.createStoredProcedureQuery("GET_EMPLOYEES", Employee.class); q.registerStoredProcedureParameter("COUNTRY", String.class, ParameterMode.IN); q.registerStoredProcedureParameter("TOTAL", Integer.class, ParameterMode.OUT); // setup the parameters q.setParameter("COUNTRY", "Poland"); // first, an implicit call to execute List<Employee> list = (List<Employee>) q.getResultList(); // ...then, we can safely obtain the output value Integer total = (Integer) q.getOutputParameterValue("TOTAL");
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query StoredProcedureQuery q = em.createStoredProcedureQuery("GET_EMPLOYEES", Employee.class); q.registerStoredProcedureParameter("COUNTRY", String.class, ParameterMode.IN); q.registerStoredProcedureParameter("TOTAL", Integer.class, ParameterMode.OUT); // setup the parameters q.setParameter("COUNTRY", "Poland"); // what if we reorder the lines? Integer total = (Integer) q.getOutputParameterValue("TOTAL"); List<Employee> list = (List<Employee>) q.getResultList();
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query StoredProcedureQuery q = em.createStoredProcedureQuery("GET_EMPLOYEES", Employee.class); q.registerStoredProcedureParameter("COUNTRY", String.class, ParameterMode.IN); q.registerStoredProcedureParameter("TOTAL", Integer.class, ParameterMode.OUT); // setup the parameters q.setParameter("COUNTRY", "Poland"); // what if we reorder the lines? Integer total = (Integer) q.getOutputParameterValue("TOTAL"); // an implicit call to execute List<Employee> list = (List<Employee>) q.getResultList();
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query q = em.createStoredProcedureQuery("GET_EMPLOYEES", Employee.class); q.registerStoredProcedureParameter("COUNTRY", String.class, ParameterMode.IN); q.registerStoredProcedureParameter("TOTAL", Integer.class, ParameterMode.OUT); // setup the parameters q.setParameter("COUNTRY", "Poland"); // execute must be called before getOutputParameterValue q.execute(); Integer total = (Integer) q.getOutputParameterValue("TOTAL"); List<Employee> list = (List<Employee>) q.getResultList();
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query q = em.createStoredProcedureQuery("GET_EMPLOYEES", Employee.class); q.registerStoredProcedureParameter("COUNTRY", String.class, ParameterMode.IN); q.registerStoredProcedureParameter("TOTAL", Integer.class, ParameterMode.OUT); // setup the parameters q.setParameter("COUNTRY", "Poland"); // execute must be called before getOutputParameterValue q.execute(); Integer total = (Integer) q.getOutputParameterValue("TOTAL"); // does it call execute once more? List<Employee> list = (List<Employee>) q.getResultList();
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query q = em.createStoredProcedureQuery("GET_EMPLOYEES", Employee.class); q.registerStoredProcedureParameter("COUNTRY", String.class, ParameterMode.IN); q.registerStoredProcedureParameter("TOTAL", Integer.class, ParameterMode.OUT); // setup the parameters q.setParameter("COUNTRY", "Poland"); // execute must be called before getOutputParameterValue q.execute(); Integer total = (Integer) q.getOutputParameterValue("TOTAL"); // an implicit call to execute only if not executed yet! List<Employee> list = (List<Employee>) q.getResultList();
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query q = em.createStoredProcedureQuery("GET_EMPLOYEES", Employee.class); // what about the order here? q.registerStoredProcedureParameter("COUNTRY", String.class, ParameterMode.IN); q.registerStoredProcedureParameter("TOTAL", Integer.class, ParameterMode.OUT); // setup the parameters q.setParameter("COUNTRY", "Poland"); // execute and retrieve the results q.execute(); Integer total = (Integer) q.getOutputParameterValue("TOTAL"); List<Employee> list = (List<Employee>) q.getResultList();
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query q = em.createStoredProcedureQuery("GET_EMPLOYEES", Employee.class); // what if we switch the lines? q.registerStoredProcedureParameter("TOTAL", Integer.class, ParameterMode.OUT); q.registerStoredProcedureParameter("COUNTRY", String.class, ParameterMode.IN); // setup the parameters q.setParameter("COUNTRY", "Poland"); // execute and retrieve the results q.execute(); Integer total = (Integer) q.getOutputParameterValue("TOTAL"); List<Employee> list = (List<Employee>) q.getResultList();
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query q = em.createStoredProcedureQuery("GET_EMPLOYEES", Employee.class); // what about the order here? q.registerStoredProcedureParameter("COUNTRY", String.class, ParameterMode.IN); q.registerStoredProcedureParameter("TOTAL", Integer.class, ParameterMode.OUT); // setup the parameters q.setParameter("COUNTRY", "Poland"); // execute and retrieve the results q.execute(); Integer total = (Integer) q.getOutputParameterValue("TOTAL"); List<Employee> list = (List<Employee>) q.getResultList();
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query q = em.createStoredProcedureQuery("GET_EMPLOYEES", Employee.class); // what about the order of the positional parameters? q.registerStoredProcedureParameter(2, Integer.class, ParameterMode.OUT); q.registerStoredProcedureParameter(1, String.class, ParameterMode.IN); // setup the parameters q.setParameter("COUNTRY", "Poland"); // execute and retrieve the results q.execute(); Integer total = (Integer) q.getOutputParameterValue("TOTAL"); List<Employee> list = (List<Employee>) q.getResultList();
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query q = em.createStoredProcedureQuery("GET_EMPLOYEES", Employee.class); // what about the order of the positional parameters? q.registerStoredProcedureParameter(2, Integer.class, ParameterMode.OUT); q.registerStoredProcedureParameter(1, String.class, ParameterMode.IN); // setup the parameters q.setParameter("COUNTRY", "Poland"); // execute and retrieve the results q.execute(); Integer total = (Integer) q.getOutputParameterValue("TOTAL"); List<Employee> list = (List<Employee>) q.getResultList();
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure Annotation @NamedStoredProcedureQuery { name = "getEmployees", procedureName = "GET_EMPLOYEES", resultClasses = Employee.class, parameters = { @StoredProcedureParameter(name="COUNTRY", mode=ParameterMode.IN, type=String.class), @StoredProcedureParameter(name="TOTAL", mode=ParameterMode.OUT, type=Integer.class) } } @Entity public class Employee { // … }
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query StoredProcedureQuery q = em.createNamedStoredProcedureQuery("getEmployees"); // setup the parameters q.setParameter("COUNTRY", "Poland"); // first, an implicit call to execute List<Employee> list = (List<Employee>) q.getResultList(); // ...then, we can safely obtain the output value Integer total = (Integer) q.getOutputParameterValue("TOTAL");
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query StoredProcedureQuery q = em.createNamedStoredProcedureQuery("getEmployees"); // setup the parameters q.setParameter("COUNTRY", "Poland"); // first, an implicit call to execute List<Employee> list = (List<Employee>) q.getResultList(); // ...then, we can safely obtain the output value Integer total = (Integer) q.getOutputParameterValue("TOTAL");
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query StoredProcedureQuery q = em.createNamedStoredProcedureQuery("getEmployees"); // setup the parameters q.setParameter("COUNTRY", "Poland"); // first, an implicit call to execute List<Employee> list = (List<Employee>) q.getResultList(); // ...then, we can safely obtain the output value Integer total = (Integer) q.getOutputParameterValue("TOTAL");
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query StoredProcedureQuery q = em.createNamedStoredProcedureQuery("getEmployees"); // no calls to registerStoredProcedureParameter // setup the parameters q.setParameter("COUNTRY", "Poland"); // first, an implicit call to execute List<Employee> list = (List<Employee>) q.getResultList(); // ...then, we can safely obtain the output value Integer total = (Integer) q.getOutputParameterValue("TOTAL");
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure -- PostgreSQL CREATE OR REPLACE FUNCTION GET_EMPLOYEES( IN GIVEN_COUNTRY VARCHAR(255), OUT TOTAL INT) RETURNS REFCURSOR AS $BODY$ DECLARE EMPS REFCURSOR; BEGIN OPEN EMPS FOR SELECT * FROM EMPLOYEE WHERE COUNTRY = GIVEN_COUNTRY; RETURN EMPS; END; $BODY$ LANGUAGE plpgsql
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure -- PostgreSQL CREATE OR REPLACE FUNCTION GET_EMPLOYEES( IN GIVEN_COUNTRY VARCHAR(255), OUT TOTAL INT) RETURNS REFCURSOR AS $BODY$ DECLARE EMPS REFCURSOR; BEGIN OPEN EMPS FOR SELECT * FROM EMPLOYEE WHERE COUNTRY = GIVEN_COUNTRY; RETURN EMPS; END; $BODY$ LANGUAGE plpgsql
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query StoredProcedureQuery q = em.createStoredProcedureQuery("GET_EMPLOYEES", Employee.class); q.registerStoredProcedureParameter(1, void.class, ParameterMode.REF_CURSOR); q.registerStoredProcedureParameter("COUNTRY", String.class, ParameterMode.IN); // setup the parameters q.setParameter("COUNTRY", "Poland"); // an implicit call to execute List<Employee> list = (List<Employee>) q.getResultList();
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure Annotation @NamedStoredProcedureQuery( name = "getEmployees", procedureName = "GET_EMPLOYEES", resultClasses = Employee.class, parameters = { @StoredProcedureParameter(mode=ParameterMode.REF_CURSOR, type=void.class), @StoredProcedureParameter(name="COUNTRY", mode=ParameterMode.IN, type=String.class) } ) @Entity public class Employee { // … }
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query StoredProcedureQuery q = em.createNamedStoredProcedureQuery(”getEmployees”); // setup the parameters q.setParameter("COUNTRY", "Poland"); // an implicit call to execute List<Employee> list = (List<Employee>) q.getResultList();
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure Annotation @NamedStoredProcedureQuery( name = "getEmployees", procedureName = "GET_EMPLOYEES", resultClasses = Employee.class, parameters = { @StoredProcedureParameter(mode=ParameterMode.REF_CURSOR, type=void.class), @StoredProcedureParameter(name="COUNTRY", mode=ParameterMode.IN, type=String.class) } ) @Entity public class Employee { // … }
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query StoredProcedureQuery q = em.createNamedStoredProcedureQuery("getEmployees"); // setup the parameters q.setParameter(2, "Poland"); // obtain the result List<Employee> list = (List<Employee>) q.getResultList();
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Example: Stored Procedure EntityManager API // create and setup a stored procedure query StoredProcedureQuery q = em.createNamedStoredProcedureQuery("getEmployees"); // setup the parameters q.setParameter(2, "Poland"); // obtain the result List<Employee> list = (List<Employee>) q.getResultList();
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Stored Procedures in JPA 2.1 Wrap-up • Annotation – @NamedStoredProcedureQuery • EntityManager API – createStoredProcedureQuery – registerStoredProcedureParameter • Use cases – Existing database – Abstraction on database level (e.g., for several applications) • Still differences between databases! – Much smaller though
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Reporting
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Reporting Anti-Patterns • Direct usage of an object-oriented domain model • Too much data loaded • Heavy processing on the Java side
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Reporting Anti-Patterns Example
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Reporting Anti-Patterns Employee Entity @Entity public class Employee { @Id @GeneratedValue private Long id; private String firstName; private String lastName; private BigDecimal salary; @OneToOne @JoinColumn(name = "address_id") private Address address; @Temporal(TemporalType.DATE) private Date startDate; @Temporal(TemporalType.DATE) private Date endDate; @ManyToOne @JoinColumn(name = "manager_id") private Employee manager; // … }
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Sum of Salaries By Country Select All (1) TypedQuery<Employee> query = em.createQuery( "SELECT e FROM Employee e", Employee.class); List<Employee> list = query.getResultList(); // calculate sum of salaries by country // map: country->sum Map<String, BigDecimal> results = new HashMap<>(); for (Employee e : list) { String country = e.getAddress().getCountry(); BigDecimal total = results.get(country); if (total == null) total = BigDecimal.ZERO; total = total.add(e.getSalary()); results.put(country, total); }
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Sum of Salaries by Country Select Join Fetch (2) TypedQuery<Employee> query = em.createQuery( "SELECT e FROM Employee e JOIN FETCH e.address", Employee.class); List<Employee> list = query.getResultList(); // calculate sum of salaries by country // map: country->sum Map<String, BigDecimal> results = new HashMap<>(); for (Employee e : list) { String country = e.getAddress().getCountry(); BigDecimal total = results.get(country); if (total == null) total = BigDecimal.ZERO; total = total.add(e.getSalary()); results.put(country, total); }
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Reporting Anti-Patterns Projection (3) Query query = em.createQuery( "SELECT e.salary, e.address.country FROM Employee e"); List<Object[]> list = (List<Object[]>) query.getResultList(); // calculate sum of salaries by country // map: country->sum Map<String, BigDecimal> results = new HashMap<>(); for (Object[] e : list) { String country = (String) e[1]; BigDecimal total = results.get(country); if (total == null) total = BigDecimal.ZERO; total = total.add((BigDecimal) e[0]); results.put(country, total); }
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Reporting Anti-Patterns Aggregation JPQL (4) Query query = em.createQuery( "SELECT SUM(e.salary), e.address.country FROM Employee e GROUP BY e.address.country"); List<Object[]> list = (List<Object[]>) query.getResultList(); // already calculated!
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Reporting Anti-Patterns Aggregation SQL (5) Query query = em.createNativeQuery( "SELECT SUM(e.salary), a.country FROM employee e JOIN address a ON e.address_id = a.id GROUP BY a.country"); List<Object[]> list = (List<Object[]>) query.getResultList(); // already calculated!
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Comparison 1-5 100 000 employees, EclipseLink MySQL PostgreSQL Select all (1+N) (1) 25704ms 18120ms Select join fetch (2) Projection (3) Aggregation JPQL (4) Aggregation SQL (5)
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Comparison 1-5 100 000 employees, EclipseLink MySQL PostgreSQL Select all (1+N) (1) 25704ms 18120ms Select join fetch (2) 6211ms 3954ms Projection (3) Aggregation JPQL (4) Aggregation SQL (5)
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Comparison 1-5 100 000 employees, EclipseLink MySQL PostgreSQL Select all (1+N) (1) 25704ms 18120ms Select join fetch (2) 6211ms 3954ms Projection (3) 533ms 569ms Aggregation JPQL (4) Aggregation SQL (5)
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Comparison 1-5 100 000 employees, EclipseLink MySQL PostgreSQL Select all (1+N) (1) 25704ms 18120ms Select join fetch (2) 6211ms 3954ms Projection (3) 533ms 569ms Aggregation JPQL (4) 410ms 380ms Aggregation SQL (5) 380ms 409ms
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | MySQL vs. PostgreSQL 68 25704 6211 533 410 380 18120 3954 569 380 4090 5000 10000 15000 20000 25000 30000 Select all (1+N) (1) Select join fetch (2) Projection (3) Aggregation JPQL (4) Aggregation SQL (5) MySQL PostgreSQL
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Projection JPQL -> Value Object Query query = em.createQuery( "SELECT new com.yonita.jpa.vo.EmployeeVO(e.salary, e.address.country) FROM Employee e"); // The list of value objects List<EmployeeVO> list = (List<EmployeeVO>) query.getResultList();
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Projection JPQL -> Value Object Query query = em.createQuery( "SELECT new com.yonita.jpa.CountryStatVO( sum(e.salary), e.address.country) FROM Employee e GROUP BY e.address.country"); // The list of value objects List<CountryStatVO> list = (List<CountryStatVO>) query.getResultList();
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Projection SQL -> Value Object @SqlResultSetMapping( name = "countryStatVO", classes = { @ConstructorResult( targetClass = CountryStatVO.class, columns = { @ColumnResult(name = "ssum", type = BigDecimal.class), @ColumnResult(name = "country", type = String.class) }) } )
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Projection SQL -> Value Object Query query = em.createNativeQuery("countryStatVO"); // The list of value objects List<CountryStatVO> list = (List<CountryStatVO>) query.getResultList();
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Projection Wrap-up • JPA 2.0 – Only JPQL query to directly produce a value object! • JPA 2.1 – JPQL and native queries to directly produce a value object! • Managed entities – Sync with database – L1/L2 cache • Use cases for Direct Value Object – Reporting, statistics, history – Read-only data, GUI data • Performance – No need for managed objects – Rich (or fat) managed objects – Subset of attributes required – Gain speed – Offload an app server
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Aggregation Wrap-up • JPA 2.0 – Selected aggregation functions: COUNT, SUM, AVG, MIN, MAX • JPA 2.1 – All function as supported by a database – Call any database function with new FUNCTION keyword • Database-specific aggregate functions – MS SQL: STDEV, STDEVP, VAR, VARP,… – MySQL: BIT_AND, BIT_OR, BIT_XOR,… – Oracle: MEDIAN, PERCENTILE,… – More… • Use cases – Reporting, statistics – Performance • Gain speed • Offload an app server to a database!
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Complex Queries
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | JPQL vs. SQL • Column/table visibility – JPA 2.0/2.1: Only mapped columns and tables • Operations on sets – UNION, INTERSECT, EXCEPT – JPA 2.0/2.1: No support • Nested fetch joins – JPA 2.0: No support – JPA 2.1: entity graphs for different fetching strategies • ON – JPA 2.0: No support – JPA 2.1: Only on “connected entities”
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | JPQL vs. SQL • Database functions – Aggregate functions – Conversion functions – Extraction functions – Manipulation functions – Functions, functions, functions… – JPA 2.0: Selected functions – JPA 2.1: All functions
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Helper Functions JPA 2.1 • String functions: – CONCAT, SUBSTRING, TRIM, LOWER, UPPER, LENGTH, LOCATE • Arithmetic functions: – ABS, SQRT, MOD, SIZE, INDEX • Date/time functions: – CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP • Aggregate functions: – COUNT, SUM, MIN, MAX, AVG • Invocation of predefined or user-defined functions: – FUNCTION(function_name {, function_args}*)
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Helper Functions JPA 2.1 • Invocation of predefined or user-defined functions: – FUNCTION(function_name {, function_args}*) – SELECT c FROM Customer c WHERE FUNCTION(‘hasGoodCredit’, c.balance, c.creditLimit)
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | JPA 2.1
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Wrap-up • JPA 2.1 – Stored procedures support – Projections • Direct value object for native queries – Richer JPQL
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Wrap-up • JPA 2.1 – Stored procedures support – Projections • Direct value object for native queries – Richer JPQL • Performance
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Wrap-up • JPA 2.1 – Stored procedures support – Projections • Direct value object for native queries – Richer JPQL • Performance – Don’t load if you don’t need
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Wrap-up • JPA 2.1 – Stored procedures support – Projections • Direct value object for native queries – Richer JPQL • Performance – Don’t load if you don’t need – Don’t execute many small queries if you can execute one big query
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Wrap-up • JPA 2.1 – Stored procedures support – Projections • Direct value object for native queries – Richer JPQL • Performance – Don’t load if you don’t need – Don’t execute many small queries if you can execute one big query – Don’t calculate if a database can
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | A fool with a tool is still a fool!
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Continuous Learning Paradigm 87
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Q+A
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | Keep Learning with Training from Oracle University 89 • Hands-on training delivered in-class or online by tenured instructors around the world • New subscription-based learning services to give you any-time access to training • Certification programs to validate your skills education.oracle.com
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | 90
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | 91
Copyright © 2014
Oracle and/or its affiliates. All rights reserved. | 92
Advertisement