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 @Override
130 public void afterPropertiesSet() throws Exception {
131 super.afterPropertiesSet();
132
133 if (queryProvider == null) {
134 Assert.notNull(entityManagerFactory);
135 Assert.hasLength(queryString);
136 }
137
138 else {
139 Assert.isTrue(queryProvider != null, "JPA query provider must be set");
140 }
141 }
142
143
144
145
146 public void setQueryString(String queryString) {
147 this.queryString = queryString;
148 }
149
150
151
152
153 public void setQueryProvider(JpaQueryProvider queryProvider) {
154 this.queryProvider = queryProvider;
155 }
156
157 @Override
158 protected void doOpen() throws Exception {
159 super.doOpen();
160
161 entityManager = entityManagerFactory.createEntityManager(jpaPropertyMap);
162 if (entityManager == null) {
163 throw new DataAccessResourceFailureException("Unable to obtain an EntityManager");
164 }
165
166
167 if (queryProvider != null) {
168 queryProvider.setEntityManager(entityManager);
169 }
170
171 }
172
173 @Override
174 @SuppressWarnings("unchecked")
175 protected void doReadPage() {
176
177 EntityTransaction tx = entityManager.getTransaction();
178 tx.begin();
179
180 entityManager.flush();
181 entityManager.clear();
182
183 Query query = createQuery().setFirstResult(getPage() * getPageSize()).setMaxResults(getPageSize());
184
185 if (parameterValues != null) {
186 for (Map.Entry<String, Object> me : parameterValues.entrySet()) {
187 query.setParameter(me.getKey(), me.getValue());
188 }
189 }
190
191 if (results == null) {
192 results = new CopyOnWriteArrayList<T>();
193 }
194 else {
195 results.clear();
196 }
197 results.addAll(query.getResultList());
198
199 tx.commit();
200 }
201
202 @Override
203 protected void doJumpToPage(int itemIndex) {
204 }
205
206 @Override
207 protected void doClose() throws Exception {
208 entityManager.close();
209 super.doClose();
210 }
211
212 }