1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.batch.item.database;
18
19 import java.util.HashMap;
20 import java.util.Map;
21 import java.util.concurrent.CopyOnWriteArrayList;
22
23 import javax.persistence.EntityManager;
24 import javax.persistence.EntityManagerFactory;
25 import javax.persistence.EntityTransaction;
26 import javax.persistence.Query;
27
28 import org.springframework.batch.item.ExecutionContext;
29 import org.springframework.batch.item.database.orm.JpaQueryProvider;
30 import org.springframework.dao.DataAccessResourceFailureException;
31 import org.springframework.util.Assert;
32 import org.springframework.util.ClassUtils;
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84 public class JpaPagingItemReader<T> extends AbstractPagingItemReader<T> {
85
86 private EntityManagerFactory entityManagerFactory;
87
88 private EntityManager entityManager;
89
90 private final Map<String, Object> jpaPropertyMap = new HashMap<String, Object>();
91
92 private String queryString;
93
94 private JpaQueryProvider queryProvider;
95
96 private Map<String, Object> parameterValues;
97
98 public JpaPagingItemReader() {
99 setName(ClassUtils.getShortName(JpaPagingItemReader.class));
100 }
101
102
103
104
105
106 private Query createQuery() {
107 if (queryProvider == null) {
108 return entityManager.createQuery(queryString);
109 }
110 else {
111 return queryProvider.createQuery();
112 }
113 }
114
115 public void setEntityManagerFactory(EntityManagerFactory entityManagerFactory) {
116 this.entityManagerFactory = entityManagerFactory;
117 }
118
119
120
121
122
123
124
125 public void setParameterValues(Map<String, Object> parameterValues) {
126 this.parameterValues = parameterValues;
127 }
128
129 public void afterPropertiesSet() throws Exception {
130 super.afterPropertiesSet();
131
132 if (queryProvider == null) {
133 Assert.notNull(entityManagerFactory);
134 Assert.hasLength(queryString);
135 }
136
137 else {
138 Assert.isTrue(queryProvider != null, "JPA query provider must be set");
139 }
140 }
141
142
143
144
145 public void setQueryString(String queryString) {
146 this.queryString = queryString;
147 }
148
149
150
151
152 public void setQueryProvider(JpaQueryProvider queryProvider) {
153 this.queryProvider = queryProvider;
154 }
155
156 @Override
157 protected void doOpen() throws Exception {
158 super.doOpen();
159
160 entityManager = entityManagerFactory.createEntityManager(jpaPropertyMap);
161 if (entityManager == null) {
162 throw new DataAccessResourceFailureException("Unable to obtain an EntityManager");
163 }
164
165
166 if (queryProvider != null) {
167 queryProvider.setEntityManager(entityManager);
168 }
169
170 }
171
172 @Override
173 @SuppressWarnings("unchecked")
174 protected void doReadPage() {
175
176 EntityTransaction tx = entityManager.getTransaction();
177 tx.begin();
178
179 entityManager.flush();
180 entityManager.clear();
181
182 Query query = createQuery().setFirstResult(getPage() * getPageSize()).setMaxResults(getPageSize());
183
184 if (parameterValues != null) {
185 for (Map.Entry<String, Object> me : parameterValues.entrySet()) {
186 query.setParameter(me.getKey(), me.getValue());
187 }
188 }
189
190 if (results == null) {
191 results = new CopyOnWriteArrayList<T>();
192 }
193 else {
194 results.clear();
195 }
196 results.addAll(query.getResultList());
197
198 tx.commit();
199 }
200
201 @Override
202 protected void doJumpToPage(int itemIndex) {
203 }
204
205 @Override
206 protected void doClose() throws Exception {
207 entityManager.close();
208 super.doClose();
209 }
210
211 }