2525import javax .persistence .Table ;
2626import javax .servlet .ServletException ;
2727import javax .servlet .annotation .WebServlet ;
28+ import javax .servlet .http .HttpServletRequest ;
29+ import javax .servlet .http .HttpServletResponse ;
2830import javax .sql .DataSource ;
2931import java .io .IOException ;
3032import java .sql .Connection ;
3335import java .util .Date ;
3436import java .util .List ;
3537import java .util .Properties ;
38+ import java .util .stream .Collectors ;
3639import java .util .stream .Stream ;
3740
3841@ WebServlet (urlPatterns ={"/employees/*" }, loadOnStartup =1 )
@@ -48,7 +51,7 @@ public interface Employee {
4851
4952 @ Entity
5053 @ Table (name ="employees" )
51- public static class EmployeeEntity {
54+ public static class EmployeeEntity implements Employee {
5255 @ Id
5356 @ Column (name = "emp_no" )
5457 private int employeeNumber ;
@@ -68,26 +71,32 @@ public static class EmployeeEntity {
6871 @ Column (name = "hire_date" )
6972 private Date hireDate ;
7073
74+ @ Override
7175 public int getEmployeeNumber () {
7276 return employeeNumber ;
7377 }
7478
79+ @ Override
7580 public String getFirstName () {
7681 return firstName ;
7782 }
7883
84+ @ Override
7985 public String getLastName () {
8086 return lastName ;
8187 }
8288
89+ @ Override
8390 public String getGender () {
8491 return gender ;
8592 }
8693
94+ @ Override
8795 public Date getBirthDate () {
8896 return birthDate ;
8997 }
9098
99+ @ Override
91100 public Date getHireDate () {
92101 return hireDate ;
93102 }
@@ -97,16 +106,16 @@ public Date getHireDate() {
97106
98107 private SessionFactory sessionFactory = null ;
99108
109+ private ThreadLocal <Boolean > useJackson = new ThreadLocal <>();
110+
100111 private static final String SQL_QUERY = QueryBuilder .select ("emp_no AS employeeNumber" ,
101112 "first_name AS firstName" ,
102113 "last_name AS lastName" ,
103114 "gender" ,
104115 "birth_date AS birthDate" ,
105116 "hire_date AS hireDate" ).from ("employees" ).toString ();
106117
107- private static final String HQL_QUERY = QueryBuilder .select ("e" ).from ("EmployeeEntity e" ).toString ();
108-
109- private static final int FETCH_SIZE = 2048 ;
118+ private static final String HQL_QUERY = QueryBuilder .select ("e" ).from ("EmployeeService$EmployeeEntity e" ).toString ();
110119
111120 @ Override
112121 public void init () throws ServletException {
@@ -131,25 +140,53 @@ public void init() throws ServletException {
131140 configuration .addAnnotatedClass (EmployeeEntity .class );
132141
133142 sessionFactory = configuration .buildSessionFactory ();
143+
144+ useJackson .set (false );
145+ }
146+
147+ @ Override
148+ public void destroy () {
149+ super .destroy ();
150+
151+ if (sessionFactory != null ) {
152+ sessionFactory .close ();
153+ }
154+ }
155+
156+ @ Override
157+ protected void encodeResult (HttpServletRequest request , HttpServletResponse response , Object result ) throws IOException {
158+ if (useJackson .get ()) {
159+ ObjectMapper objectMapper = new ObjectMapper ();
160+
161+ objectMapper .enable (SerializationFeature .INDENT_OUTPUT );
162+
163+ objectMapper .writeValue (getResponse ().getOutputStream (), result );
164+ } else {
165+ super .encodeResult (request , response , result );
166+ }
134167 }
135168
136169 @ RequestMethod ("GET" )
137170 @ ResourcePath ("sql" )
138- public Iterable <Employee > getEmployees () throws SQLException {
171+ public List <Employee > getEmployees () throws SQLException {
139172 try (Connection connection = dataSource .getConnection ();
140173 Statement statement = connection .createStatement ();
141174 ResultSetAdapter resultSetAdapter = new ResultSetAdapter (statement .executeQuery (SQL_QUERY ))) {
142- resultSetAdapter .setFetchSize ( FETCH_SIZE );
143-
144- return new StreamAdapter <>( resultSetAdapter . stream (). map ( result -> BeanAdapter . adapt ( result , Employee . class ) ));
175+ return resultSetAdapter .stream ()
176+ . map ( result -> ( Employee ) BeanAdapter . adapt ( result , Employee . class ))
177+ . collect ( Collectors . toList ( ));
145178 }
146179 }
147180
148181 @ RequestMethod ("GET" )
149- @ ResourcePath ("hql" )
150- public List <EmployeeEntity > getEmployeesHibernate () {
151- try (Session session = sessionFactory .openSession ()) {
152- return session .createQuery (HQL_QUERY , EmployeeEntity .class ).list ();
182+ @ ResourcePath ("sql-jackson" )
183+ public List <Employee > getEmployeesJackson () throws SQLException {
184+ useJackson .set (true );
185+
186+ try {
187+ return getEmployees ();
188+ } finally {
189+ useJackson .set (false );
153190 }
154191 }
155192
@@ -163,12 +200,30 @@ public void streamEmployees() throws SQLException, IOException {
163200 try (Connection connection = dataSource .getConnection ();
164201 Statement statement = connection .createStatement ();
165202 ResultSetAdapter resultSetAdapter = new ResultSetAdapter (statement .executeQuery (SQL_QUERY ))) {
166- resultSetAdapter .setFetchSize (FETCH_SIZE );
167-
168203 jsonEncoder .write (resultSetAdapter , getResponse ().getOutputStream ());
169204 }
170205 }
171206
207+ @ RequestMethod ("GET" )
208+ @ ResourcePath ("hql" )
209+ public List <? extends Employee > getEmployeesHibernate () {
210+ try (Session session = sessionFactory .openSession ()) {
211+ return session .createQuery (HQL_QUERY , EmployeeEntity .class ).list ();
212+ }
213+ }
214+
215+ @ RequestMethod ("GET" )
216+ @ ResourcePath ("hql-jackson" )
217+ public List <? extends Employee > getEmployeesHibernateJackson () {
218+ useJackson .set (true );
219+
220+ try {
221+ return getEmployeesHibernate ();
222+ } finally {
223+ useJackson .set (false );
224+ }
225+ }
226+
172227 @ RequestMethod ("GET" )
173228 @ ResourcePath ("hql-stream" )
174229 public void streamEmployeesHibernate () throws IOException {
@@ -177,7 +232,7 @@ public void streamEmployeesHibernate() throws IOException {
177232 JSONEncoder jsonEncoder = new JSONEncoder ();
178233
179234 try (Session session = sessionFactory .openSession ();
180- StreamAdapter <EmployeeEntity > streamAdapter = new StreamAdapter <>(session .createQuery (HQL_QUERY , EmployeeEntity .class ).stream ())) {
235+ StreamAdapter <? > streamAdapter = new StreamAdapter <>(session .createQuery (HQL_QUERY , EmployeeEntity .class ).stream (). map ( BeanAdapter :: new ))) {
181236 jsonEncoder .write (streamAdapter , getResponse ().getOutputStream ());
182237 }
183238 }
@@ -198,9 +253,9 @@ public void streamEmployeesHibernateJackson() throws IOException {
198253 SequenceWriter sequenceWriter = objectWriter .writeValues (getResponse ().getOutputStream ())) {
199254 sequenceWriter .init (true );
200255
201- stream .forEach (employeeEntity -> {
256+ stream .forEach (employee -> {
202257 try {
203- sequenceWriter .write (employeeEntity );
258+ sequenceWriter .write (employee );
204259 } catch (IOException exception ) {
205260 throw new RuntimeException (exception );
206261 }
0 commit comments