44import Objects .loanModel ;
55import jakarta .ejb .EJB ;
66import jakarta .ejb .Stateless ;
7+ import oracle .jdbc .OracleTypes ;
78
89import java .sql .*;
910import java .time .LocalDate ;
@@ -242,27 +243,22 @@ public void markAsPaid(int fineId) {
242243 }
243244 }
244245
245- public ArrayList <fineModel > geFineReportForCustomer (int customerId , Date startDate , Date endDate ) {
246- String query = "SELECT f.FINE_ID, f.FINE_AMOUNT, f.FINE_DATE, f.PAID, " +
247- "b.TITLE, u.LAST_NAME, u.FIRST_NAME, " +
248- "a.FIRST_NAME AS AUTHOR_FIRST_NAME, a.LAST_NAME AS AUTHOR_LAST_NAME " +
249- "FROM fines f " +
250- "INNER JOIN loans l ON l.LOAN_ID = f.LOAN_ID " +
251- "INNER JOIN books b ON b.BOOK_ID = l.BOOK_ID " +
252- "INNER JOIN AUTHORS a ON a.AUTHOR_ID = b.AUTHOR_ID " +
253- "INNER JOIN LIBRARY_USERS u ON u.USER_ID = l.USER_ID " +
254- "WHERE l.USER_ID = ? AND f.FINE_DATE >= ? AND f.FINE_DATE <= ?" ;
246+ public ArrayList <fineModel > getFineReportForCustomer (int customerId , Date startDate , Date endDate ) {
247+ String query = "{CALL GET_FINE_REPORT_FOR_CUSTOMER(?, ?, ?, ?)}" ;
255248
256249 ArrayList <fineModel > fineList = new ArrayList <>();
257250
258251 try (Connection con = oracleClientProviderBean .getOracleClient ();
259- PreparedStatement pstmt = con .prepareStatement (query )) {
252+ CallableStatement cstmt = con .prepareCall (query )) {
253+
254+ cstmt .setInt (1 , customerId );
255+ cstmt .setObject (2 , new java .sql .Date (startDate .getTime ()));
256+ cstmt .setObject (3 , new java .sql .Date (endDate .getTime ()));
257+ cstmt .registerOutParameter (4 , OracleTypes .CURSOR );
260258
261- pstmt .setInt (1 , customerId );
262- pstmt .setObject (2 , new java .sql .Date (startDate .getTime ()));
263- pstmt .setObject (3 , new java .sql .Date (endDate .getTime ()));
259+ cstmt .execute ();
264260
265- try (ResultSet rs = pstmt . executeQuery ( )) {
261+ try (ResultSet rs = ( ResultSet ) cstmt . getObject ( 4 )) {
266262 while (rs .next ()) {
267263 fineModel fine = new fineModel ();
268264 fine .setFineId (rs .getLong ("FINE_ID" ));
@@ -283,4 +279,5 @@ public ArrayList<fineModel> geFineReportForCustomer(int customerId, Date startDa
283279
284280 return fineList ;
285281 }
282+
286283}
0 commit comments