1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.springframework.batch.item.database;
17
18 import java.util.Collection;
19 import java.util.List;
20 import java.util.Map;
21
22 import org.hibernate.Query;
23 import org.hibernate.ScrollMode;
24 import org.hibernate.ScrollableResults;
25 import org.hibernate.Session;
26 import org.hibernate.SessionFactory;
27 import org.hibernate.StatelessSession;
28 import org.springframework.batch.item.database.orm.HibernateQueryProvider;
29 import org.springframework.beans.factory.InitializingBean;
30 import org.springframework.util.Assert;
31 import org.springframework.util.StringUtils;
32
33
34
35
36
37
38
39
40 public class HibernateItemReaderHelper<T> implements InitializingBean {
41
42 private SessionFactory sessionFactory;
43
44 private String queryString = "";
45
46 private String queryName = "";
47
48 private HibernateQueryProvider queryProvider;
49
50 private boolean useStatelessSession = true;
51
52 private StatelessSession statelessSession;
53
54 private Session statefulSession;
55
56
57
58
59 public void setQueryName(String queryName) {
60 this.queryName = queryName;
61 }
62
63
64
65
66 public void setQueryString(String queryString) {
67 this.queryString = queryString;
68 }
69
70
71
72
73 public void setQueryProvider(HibernateQueryProvider queryProvider) {
74 this.queryProvider = queryProvider;
75 }
76
77
78
79
80
81
82
83
84 public void setUseStatelessSession(boolean useStatelessSession) {
85 Assert.state(statefulSession == null && statelessSession == null,
86 "The useStatelessSession flag can only be set before a session is initialized.");
87 this.useStatelessSession = useStatelessSession;
88 }
89
90
91
92
93 public void setSessionFactory(SessionFactory sessionFactory) {
94 this.sessionFactory = sessionFactory;
95 }
96
97 @Override
98 public void afterPropertiesSet() throws Exception {
99
100 Assert.state(sessionFactory != null, "A SessionFactory must be provided");
101
102 if (queryProvider == null) {
103 Assert.notNull(sessionFactory, "session factory must be set");
104 Assert.state(StringUtils.hasText(queryString) ^ StringUtils.hasText(queryName),
105 "queryString or queryName must be set");
106 }
107
108 else {
109 Assert.state(queryProvider != null, "Hibernate query provider must be set");
110 }
111
112 }
113
114
115
116
117
118
119
120
121
122 public ScrollableResults getForwardOnlyCursor(int fetchSize, Map<String, Object> parameterValues) {
123 Query query = createQuery();
124 if (parameterValues != null) {
125 query.setProperties(parameterValues);
126 }
127 return query.setFetchSize(fetchSize).scroll(ScrollMode.FORWARD_ONLY);
128 }
129
130
131
132
133 public Query createQuery() {
134
135 if (useStatelessSession) {
136 if (statelessSession == null) {
137 statelessSession = sessionFactory.openStatelessSession();
138 }
139 if (queryProvider != null) {
140 queryProvider.setStatelessSession(statelessSession);
141 }
142 else {
143 if (StringUtils.hasText(queryName)) {
144 return statelessSession.getNamedQuery(queryName);
145 }
146 else {
147 return statelessSession.createQuery(queryString);
148 }
149 }
150 }
151 else {
152 if (statefulSession == null) {
153 statefulSession = sessionFactory.openSession();
154 }
155 if (queryProvider != null) {
156 queryProvider.setSession(statefulSession);
157 }
158 else {
159 if (StringUtils.hasText(queryName)) {
160 return statefulSession.getNamedQuery(queryName);
161 }
162 else {
163 return statefulSession.createQuery(queryString);
164 }
165 }
166 }
167
168
169 return queryProvider.createQuery();
170
171 }
172
173
174
175
176
177
178 public void jumpToItem(ScrollableResults cursor, int itemIndex, int flushInterval) {
179 for (int i = 0; i < itemIndex; i++) {
180 cursor.next();
181 if (i % flushInterval == 0 && !useStatelessSession) {
182 statefulSession.clear();
183 }
184 }
185 }
186
187
188
189
190 public void close() {
191 if (statelessSession != null) {
192 statelessSession.close();
193 statelessSession = null;
194 }
195 if (statefulSession != null) {
196 statefulSession.close();
197 statefulSession = null;
198 }
199 }
200
201
202
203
204
205
206
207
208
209
210
211
212 public Collection<? extends T> readPage(int page, int pageSize, int fetchSize, Map<String, Object> parameterValues) {
213
214 clear();
215
216 Query query = createQuery();
217 if (parameterValues != null) {
218 query.setProperties(parameterValues);
219 }
220 @SuppressWarnings("unchecked")
221 List<T> result = query.setFetchSize(fetchSize).setFirstResult(page * pageSize).setMaxResults(pageSize).list();
222 return result;
223
224 }
225
226
227
228
229 public void clear() {
230 if (statefulSession != null) {
231 statefulSession.clear();
232 }
233 }
234
235 }