3. Java Persistence API
Queries (1 of 2)
Queries (2 of 2)
DAO & Service Interfaces
MerchantDaoImpl Class
MerchantServiceImpl Class
Main Class
Java Persistence Query Language
Filtering Results
Exercise: Find Payments
DAO & Service Interfaces
PaymentDaoImpl Class
PaymentServiceImpl Class
Main Class
Exercise: Find Payments
Joins Between Entities
Join Example
DAO & Service Interfaces
CustomerDaoImpl Class
CustomerServiceImpl Class
Main Class
Join Example
Aggregate Queries
Aggregate Example
DAO & Service Interfaces
PaymentDaoImpl Class
Main Class
Aggregate Example
Query Positional Parameters
DAO & Service Interfaces
PaymentDaoImpl Class
Main Class
Query Named Parameters
PaymentDaoImpl Class
Executing Queries
getResultList() Method
Exercise: Sort Merchants
DAO & Service Interfaces
MerchantDaoImpl Class
Main Class
Exercise: Sort Merchants
getSingleResult() Method
Working with Query Results
Constructor expressions (1/2)
Constructor expressions (2/2)
Example: Grouping Payments
Class Result
DAO & Service Interfaces
MerchantDaoImpl Class
Main Class
Example: Grouping Payments
215.00K
Category: programmingprogramming

3. Java Persistence API. 4. Java Persistence Query Language

1. 3. Java Persistence API

4. Java Persistence Query
Language

2. Queries (1 of 2)

• In JPA: SQL -> JP QL (Java Persistence
Query Language)
• A query is implemented in code as a Query
or TypedQuery object. They are constructed
using the EntityManager as a factory
• A query can be customized according to the
needs of the application
09.01.2017 2:08
2

3. Queries (2 of 2)

• A query can be issued at runtime by
supplying the JP QL query criteria, or a
criteria object. Example:
TypedQuery<Merchant> query =
em.createQuery("SELECT m FROM
Merchant m", Merchant.class);
List<Merchant> listM = null;
listM = query.getResultList();
. . . . . . . . . . . .
• See P341SelectMerchant project for the full text
09.01.2017 2:08
3

4. DAO & Service Interfaces

DAO & Service Interfaces
public interface MerchantDao {
public Merchant findById(int id);
public List<Merchant> findAll();
}
public interface MerchantService {
public Merchant findById(int id);
public List<Merchant> findAll();
}
09.01.2017 2:08
4

5. MerchantDaoImpl Class

@Repository
public class MerchantDaoImpl implements MerchantDao{
@PersistenceContext
private EntityManager em;
............
public List<Merchant> findAll(){
TypedQuery<Merchant> query =
em.createQuery("SELECT m FROM Merchant m",
Merchant.class);
List<Merchant> listM = null;
listM = query.getResultList();
return listM; }}
09.01.2017 2:08
5

6. MerchantServiceImpl Class

@Named
public class MerchantServiceImpl implements
MerchantService{
@Inject
private MerchantDao merchantDao;
.............
public List<Merchant> findAll(){
return merchantDao.findAll();
}
}
09.01.2017 2:08
6

7. Main Class

@SuppressWarnings("resource")
public static void main(String[] args) {
ApplicationContext context = new
ClassPathXmlApplicationContext("beans.xml");
MerchantService merchantService =
context.getBean(MerchantService.class);
List<Merchant> list = merchantService.findAll();
for(Merchant m: list)
System.out.println("name = " + m.getName() + "
charge = " +m.getCharge());
}
09.01.2017 2:08
7

8. Java Persistence Query Language

• Java Persistence Query Language (JP QL)
is a database-independent query language
that operates on the logical entity model as
opposed to the physical data model
• Queries may also be expressed in SQL to
take advantage of the underlying database
• The key difference between SQL and JP QL
is that instead of selecting from a table, an
entity from the application domain model has
been specified instead
09.01.2017 2:08
8

9. Filtering Results

• JP QL supports the WHERE clause to set
conditions on the data being returned
• Majority of operators commonly available
in SQL are available in JP QL:
– basic comparison operators
– IN expression
– LIKE expression
– BETWEEN expression
– subqueries
09.01.2017 2:08
9

10. Exercise: Find Payments

• Find all payments to the given merchant
09.01.2017 2:08
10

11. DAO & Service Interfaces

DAO & Service Interfaces
public interface PaymentDao {
public List<Payment> findByMerchantId(int id);
}
public interface PaymentService {
public List<Payment> findByMerchantId(int id);
}
09.01.2017 2:08
11

12. PaymentDaoImpl Class

@Repository
public class PaymentDaoImpl implements PaymentDao{
@PersistenceContext
private EntityManager em;
public List<Payment> findByMerchantId(int id){
TypedQuery<Payment> query =
em.createQuery("SELECT p FROM Payment p
WHERE p.merchantId = " + id, Payment.class);
return query.getResultList();
}
}
09.01.2017 2:08
12

13. PaymentServiceImpl Class

@Named
public class PaymentServiceImpl implements PaymentService{
@Inject
private PaymentDao paymentDao;
public List<Payment> findByMerchantId(int id){
return paymentDao.findByMerchantId(id);
}
}
09.01.2017 2:08
13

14. Main Class

@SuppressWarnings("resource")
public static void main(String[] args) {
ApplicationContext context = new
ClassPathXmlApplicationContext("beans.xml");
PaymentService paymentService =
context.getBean(PaymentService.class);
List<Payment> list = paymentService.findByMerchantId(3);
for(Payment p: list)
System.out.println(p.toString());
}
09.01.2017 2:08
14

15. Exercise: Find Payments

• See P342PaymentsWhere project for the
full text
09.01.2017 2:08
15

16. Joins Between Entities

• Just as with SQL and tables, if we want to
navigate along a collection association
and return elements of that collection, we
must join the two entities together
• In JP QL, joins may also be expressed in
the FROM clause using the JOIN operator
09.01.2017 2:08
16

17. Join Example

• Get names of customers who payed more
then 500.0 by the time
09.01.2017 2:08
17

18. DAO & Service Interfaces

DAO & Service Interfaces
public interface CustomerDao {
public Customer findById(int id);
..............
public List<String> getNames(double sumPayed);
}
public interface CustomerService {
public Customer findById(int id);
..............
public List<String> getNames(double sumPayed);
}
09.01.2017 2:08
18

19. CustomerDaoImpl Class

public List<String> getNames(double sumPayed){
String txt = "SELECT DISTINCT c.name FROM ";
txt += "Payment p, Customer c " ;
txt += "WHERE c.id = p.customerId AND p.sumPayed > "
+ sumPayed;
TypedQuery<String> query = em.createQuery(txt, String.class);
return query.getResultList();
}
09.01.2017 2:08
19

20. CustomerServiceImpl Class

public List<String> getNames(double sumPayed){
return customerDao.getNames(sumPayed);
}
09.01.2017 2:08
20

21. Main Class

@SuppressWarnings("resource")
public static void main(String[] args) {
ApplicationContext context = new
ClassPathXmlApplicationContext("beans.xml");
CustomerService customerService =
context.getBean(CustomerService.class);
List<String> list = customerService.getNames(500.0);
for(String s: list)
System.out.println(s);
}
09.01.2017 2:08
21

22. Join Example

See P343PaymentJoin project for the full
text
09.01.2017 2:08
22

23. Aggregate Queries

• There are five supported aggregate
functions (AVG, COUNT, MIN, MAX, SUM)
• Results may be grouped in the GROUP BY
clause and filtered using the HAVING
clause.
09.01.2017 2:08
23

24. Aggregate Example

• Find the sum of all payments
09.01.2017 2:08
24

25. DAO & Service Interfaces

DAO & Service Interfaces
public interface PaymentDao {
public List<Payment> findByMerchantId(int id);
public double getPaymentSum();
}
public interface PaymentService {
public List<Payment> findByMerchantId(int id);
public double getPaymentSum();
}
09.01.2017 2:08
25

26. PaymentDaoImpl Class

public double getPaymentSum(){
TypedQuery<Double> query = em.createQuery
("SELECT SUM(p.sumPayed) FROM
Payment p", Double.class);
return query.getSingleResult();
}
09.01.2017 2:08
26

27. Main Class

@SuppressWarnings("resource")
public static void main(String[] args) {
ApplicationContext context = new
ClassPathXmlApplicationContext("beans.xml");
PaymentService paymentService =
context.getBean(PaymentService.class);
double sum = paymentService.getPaymentSum();
System.out.println("total = " + sum);
}
09.01.2017 2:08
27

28. Aggregate Example

See P344Aggregation project for the full text
09.01.2017 2:08
28

29. Query Positional Parameters

• Parameters are indicated in the query
string by a question mark followed by the
parameter number
• When the query is executed, the
developer specifies the parameter number
that should be replaced
09.01.2017 2:08
29

30. DAO & Service Interfaces

DAO & Service Interfaces
public interface PaymentDao {
public List<Payment> findByMerchantId(int id);
public double getPaymentSum();
public List<Payment> getLargePayments(double limit);
}
public interface PaymentService {
public List<Payment> findByMerchantId(int id);
public double getPaymentSum();
public List<Payment> getLargePayments(double limit);
}
09.01.2017 2:08
30

31. PaymentDaoImpl Class

public List<Payment> getLargePayments(double limit){
TypedQuery<Payment> query = em.createQuery
("SELECT p FROM Payment p WHERE
p.sumPayed > ?1", Payment.class);
query.setParameter(1, limit);
return query.getResultList();
}
09.01.2017 2:08
31

32. Main Class

@SuppressWarnings("resource")
public static void main(String[] args) {
ApplicationContext context = new
ClassPathXmlApplicationContext("beans.xml");
PaymentService paymentService =
context.getBean(PaymentService.class);
List<Payment> list =
paymentService.getLargePayments(750.0);
for (Payment p: list)
System.out.println(p.toString());
}
See P345Parameters project for the full text
09.01.2017 2:08
32

33. Query Named Parameters

• Named parameters may also be used and
are indicated in the query string by a colon
followed by the parameter name
• When the query is executed, the
developer specifies the parameter name
that should be replaced
09.01.2017 2:08
33

34. PaymentDaoImpl Class

public List<Payment> getLargePayments(double limit){
TypedQuery<Payment> query = em.createQuery
("SELECT p FROM Payment p WHERE
p.sumPayed > :limit", Payment.class);
query.setParameter("limit", limit);
return query.getResultList();
}
See P245Parameters project for the full text
09.01.2017 2:08
34

35. Executing Queries

• The TypedQuery interface provides three
different ways to execute a query:
– getSingleResult() - if the query is expected to
return a single result
– getResultList() - if more than one result may
be returned
– executeUpdate() - is used to invoke bulk
update and delete queries
09.01.2017 2:08
35

36. getResultList() Method

• Returns a collection containing the query results
• If the query did not return any data, the collection is
empty
• The return type is specified as a List instead of a
Collection in order to support queries that specify a
sort order
• If the query uses the ORDER BY clause to specify a
sort order, the results will be put into the result list in
the same order
09.01.2017 2:08
36

37. Exercise: Sort Merchants

• Create a project to sort merchants by the
value of needToSend field
09.01.2017 2:08
37

38. DAO & Service Interfaces

DAO & Service Interfaces
public interface MerchantDao {
public Merchant findById(int id);
public List<Merchant> getSortedByNeedToPay();
}
public interface MerchantService {
public Merchant findById(int id);
public List<Merchant> getSortedByNeedToPay();
}
09.01.2017 2:08
38

39. MerchantDaoImpl Class

public List<Merchant> getSortedByNeedToPay(){
String txt = "SELECT m FROM Merchant m ORDER BY
m.needToSend";
TypedQuery<Merchant> query = em.createQuery(txt,
Merchant.class);
return query.getResultList();
}
09.01.2017 2:08
39

40. Main Class

@SuppressWarnings("resource")
public static void main(String[] args) {
ApplicationContext context = new
ClassPathXmlApplicationContext("beans.xml");
MerchantService merchantService =
context.getBean(MerchantService.class);
List<Merchant> list =
merchantService.getSortedByNeedToPay();
for(Merchant m: list)
System.out.println("name = " + m.getName() + "
sumToPay = " + m .getNeedToSend());
}
09.01.2017 2:08
40

41. Exercise: Sort Merchants

• See P346Sort project for the full text
09.01.2017 2:08
41

42. getSingleResult() Method

• Instead of iterating to the first result in a
collection, the object is directly returned
• Throws a NoResultException exception
when no results are available
• Throws a NonUniqueResultException
exception if multiple results are available
after executing the query
09.01.2017 2:08
42

43. Working with Query Results

• The result type of a query is determined by
the expressions listed in the SELECT
clause of the query:
– Basic types, such as String, the primitive
types, and JDBC types
– Entity types
– An array of Object
– User-defined types created from a constructor
expression
09.01.2017 2:08
43

44. Constructor expressions (1/2)

• Provide developers with a way to map array
of Object result types to custom objects
• Typically this is used to convert the results
into JavaBean-style classes that provide
getters for the different returned values
• A constructor expression is defined in JP QL
using the NEW operator in the SELECT
clause
09.01.2017 2:08
44

45. Constructor expressions (2/2)

• The argument to the NEW operator is the
fully qualified name of the class that will
be instantiated to hold the results for each
row of data returned
• The only requirement on this class is that it
has a constructor with arguments
matching the exact type and order that will
be specified in the query.
09.01.2017 2:08
45

46. Example: Grouping Payments

• Get general sum of charge for every
merchant
09.01.2017 2:08
46

47. Class Result

public class Result {
private String name;
private double sum;
public Result(){ }
public Result(String name, double sum){
this.name = name;
this.sum = sum;
}
public String getName() { return name; }
. . . . . . .
09.01.2017 2:08
47

48. DAO & Service Interfaces

DAO & Service Interfaces
public interface MerchantDao {
public Merchant findById(int id);
public List<Merchant> getSortedByNeedToPay();
public List<Result> getTotalReport();
}
public interface MerchantService {
public Merchant findById(int id);
public List<Merchant> getSortedByNeedToPay();
public List<Result> getTotalReport();
}
09.01.2017 2:08
48

49. MerchantDaoImpl Class

public List<Result> getTotalReport(){
String txt = "SELECT new com.bionic.edu.Result
(m.name, SUM(p.chargePayed)) ";
txt += "FROM Payment p, Merchant m WHERE m.id =
p.merchantId GROUP BY m.name";
TypedQuery<Result> query = em.createQuery(txt,
Result.class);
return query.getResultList();
}
09.01.2017 2:08
49

50. Main Class

@SuppressWarnings("resource")
public static void main(String[] args) {
ApplicationContext context = new
ClassPathXmlApplicationContext("beans.xml");
MerchantService merchantService =
context.getBean(MerchantService.class);
List<Result> list = merchantService.getTotalReport();
for(Result r: list)
System.out.format("%1$25s %2$8.2f \n",
r.getName(), r.getSum());
}
09.01.2017 2:08
50

51. Example: Grouping Payments

• See P347Grouping project for the full text
09.01.2017 2:08
51
English     Русский Rules