package scut.job.dao.hibernate.support;
002
003 import org.springframework.orm.hibernate3.HibernateCallback;
004 import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
005 import org.hibernate.Session;
006 import org.hibernate.Query;
007 import org.hibernate.HibernateException;
008
009 import scut.job.util.Assert;
010
011 import java.sql.SQLException;
012 import java.util.List;
013
014 public class MyHibernateDaoSupport extends HibernateDaoSupport {
015
016 protected int MAX_BATCH_ROW = 20;
017
018 // 批量更新.返回更新影響的行數
019 public <T> int batchUpdate(final T[] array) {
020 int affectedRow = (Integer) getHibernateTemplate().execute(
021 new HibernateCallback() {
022 public Object doInHibernate(Session session)
023 throws HibernateException, SQLException {
024 for (int i = 0; i < array.length; ++i) {
025 session.update(array[i]);
026 if (i % MAX_BATCH_ROW == 0) {
027 session.flush();
028 session.clear();
029 }
030 }
031 session.flush();
032 session.clear();
033 return array.length;
034 }
035 });
036 return affectedRow;
037 }
038
039 // 批量保存.返回持久化影響的行數
040 public <T> int batchSave(final T[] array) {
041 int affectedRow = (Integer) getHibernateTemplate().execute(
042 new HibernateCallback() {
043 public Object doInHibernate(Session session)
044 throws HibernateException, SQLException {
045 for (int i = 0; i < array.length; ++i) {
046 session.save(array[i]);
047 if (i % MAX_BATCH_ROW == 0) {
048 session.flush();
049 session.clear();
050 }
051 }
052 session.flush();
053 session.clear();
054 return array.length;
055 }
056 });
057 return affectedRow;
058 }
059
060 // 批量刪除.返回刪除影響的行數
061 public <T> int batchDelete(final T[] array) {
062 int affectedRow = (Integer) getHibernateTemplate().execute(
063 new HibernateCallback() {
064 public Object doInHibernate(Session session)
065 throws HibernateException, SQLException {
066 for (int i = 0; i < array.length; ++i) {
067 session.delete(array[i]);
068 if (i % MAX_BATCH_ROW == 0) {
069 session.flush();
070 session.clear();
071 }
072 }
073 session.flush();
074 session.clear();
075 return array.length;
076 }
077 });
078 return affectedRow;
079 }
080
081 // 按主鍵批量刪除.返回刪除影響的行數
082 public <T> int batchDelete(final Class<T> entityClass, final Integer[] Ids) {
083 int affectedRow = (Integer) getHibernateTemplate().execute(
084 new HibernateCallback() {
085 public Object doInHibernate(Session session)
086 throws HibernateException, SQLException {
087 String hql = "delete from " + entityClass.getName()
088 + " a where a.id=?";
089 int count = 0;
090 for (int i = 0; i < Ids.length; ++i) {
091 Query delete = session.createQuery(hql)
092 .setParameter(0, Ids[i]);
093 count += delete.executeUpdate();
094 if (i % MAX_BATCH_ROW == 0) {
095 session.flush();
096 session.clear();
097 }
098 }
099 session.flush();
100 session.clear();
101 return count;
102 }
103 });
104 return affectedRow;
105 }
106
107 // 按主鍵刪除.返回刪除影響的行數
108 public <T> int delete(final Class<T> entityClass, final Integer id) {
109 int affectedRow = (Integer) getHibernateTemplate().execute(
110 new HibernateCallback() {
111 public Object doInHibernate(Session session)
112 throws HibernateException, SQLException {
113 String hql = "delete from " + entityClass.getName()
114 + " a where a.id=?";
115 return session.createQuery(hql).setParameter(0, id)
116 .executeUpdate();
117 }
118 });
119 return affectedRow;
120 }
121
122 // ------------------------------------------------------------------
123 // 統計方法
124 // ------------------------------------------------------------------
125
126 // hql,不要參數
127 public int count(final String hql) {
128 return count(hql, null);
129 }
130
131 // hql,一個參數
132 public int count(final String hql, final Object value) {
133 return count(hql, new Object[]{ value });
134 }
135
136 // hql,多個參數
137 public int count(final String hql, final Object[] values) {
138 int rowCount = (Integer) getHibernateTemplate().execute(
139 new HibernateCallback() {
140 public Object doInHibernate(Session session)
141 throws HibernateException, SQLException {
142 String hql2 = hql;
143 //截斷order by
144 int endIndex = hql2.lastIndexOf("order by");
145 if (endIndex > 0){
146 hql2 = hql2.substring(0, endIndex);
147 }
148 Query query = session.createQuery(hql2);
149 if (values != null){
150 for (int i = 0; i < values.length; ++i) {
151 query.setParameter(i, values[i]);
152 }
153 }
154 return Integer.parseInt(query.list().get(0).toString());
155 }
156 });
157 return rowCount;
158 }
159
160 // ------------------------------------------------------------------
161 // 分頁查詢
162 // ------------------------------------------------------------------
163
164 // 查詢一個類的所有記錄
165 public <T> QueryResutl<T> findAll(final Class<T> entityClass,
166 final int offset, final int pageSize) {
167 final String hql = "from " + entityClass.getName();
168 List<T> list = findByPage(hql, offset, pageSize);
169 String hql2 = "select count(*) " + hql;
170 int totalRow = count(hql2);
171 return new QueryResutl<T>(list, totalRow);
172 }
173
174 // 查詢的hql語句要以from開頭
175 public <T> QueryResutl<T> queryAsFrom(final Class<T> entityClass,
176 final String hqlFrom, final int offset, final int pageSize) {
177 List<T> list = findByPage(hqlFrom, offset, pageSize);
178 String hql2 = "select count(*)" + hqlFrom;
179 int totalRow = count(hql2);
180 return new QueryResutl<T>(list, totalRow);
181 }
182
183 // 查詢的hql可以是select開頭或from開頭
184 public <T> QueryResutl<T> query(final Class<T> entityClass,
185 final String hql, final int offset, final int pageSize) {
186 Assert.hasText(hql, "[Assertion failed] - this hql must have text; it must not be null, empty, or blank");
187 if (hql.trim().startsWith("from")) {
188 return queryAsFrom(entityClass, hql, offset, pageSize);
189 } else {
190 List<T> list = findByPage(hql, offset, pageSize);
191 int begin = hql.indexOf("from");
192 int end = hql.length();
193 String hql2 = "select count(*) from " + hql.substring(begin, end);
194 int totalRow = count(hql2);
195 return new QueryResutl<T>(list, totalRow);
196 }
197 }
198
199 // hql,不需要參數
200 public <T> List<T> findByPage(final String hql, final int offset,
201 final int pageSize) {
202 return findByPage(hql, null, offset, pageSize);
203 }
204
205 // hql,一個參數
206 public <T> List<T> findByPage(final String hql, final Object value,
207 final int offset, final int pageSize) {
208 return findByPage(hql, new Object[] { value }, offset, pageSize);
209 }
210
211 // hql,多個參數
212 @SuppressWarnings("unchecked")
213 public <T> List<T> findByPage(final String hql, final Object[] values,
214 final int offset, final int pageSize) {
215 // 通過一個HibernateCallback對象來執行查詢
216 List<T> list = getHibernateTemplate().executeFind(
217 new HibernateCallback() {
218 // 實現HibernateCallback接口必須實現的方法
219 public Object doInHibernate(Session session)
220 throws HibernateException, SQLException {
221 // 執行Hibernate分頁查詢
222 Query query = session.createQuery(hql);
223 if (values != null) {
224 // 爲hql語句傳入參數
225 for (int i = 0; i < values.length; i++) {
226 query.setParameter(i, values[i]);
227 }
228 }
229 List<T> result = query.setFirstResult(offset)
230 .setMaxResults(pageSize).list();
231 return result;
232 }
233 });
234 return list;
235 }
236 }
DAO的一些便利方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.