多个项目总结下来,借鉴多位朋友的代码,此BaseDAO较为通用,不敢独享。在设计DAO时也可以将其做为一个CommonDAO,里面常的数据库操作方法均已实现,本人将会对其不断完善
汗,附件上传不了。。。。
我目前对分页方法是对查询进行二次,第一次按条件查出结果集的总行数,已后则用Hibernate的分页策略来查了,这样做的方法好是好,通过我的Pager类,可以方便完成所有分页和查询。
如网友看到此文,希望考虑一下一个地方,那就是用什么好的方式来获得指定条件的结果集总行数,目前我的方法是用单独用一个查询来做。相信有更好的办法,如果您有,望您告诉我哦!
//
OrderBy orderby 是一个枚举,ASC & DESC
public List getObjectByPage( final Class clazz, final Integer curPage,
final Integer pageSize, final Map where, final OrderBy orderby,
final String orderByFiedName) {
return getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
List list = new ArrayList();
String strWhere = "from " + clazz.getName() + " as a";
if (where != null) {
// 代条件
//entrySet() 返回此映射中包含的映射关系的 set 视图。
Set<Map.Entry> set = where.entrySet();
strWhere += " where ";
for (Entry e : set) {
strWhere += " a." + e.getKey() + " = ?" + " and ";
}
//boolean endsWith(String suffix)
// 测试此字符串是否以指定的后缀结束
if (strWhere.endsWith(" and ")) {
strWhere = strWhere.substring(0, strWhere
.lastIndexOf(" and "));
}
// 代排序
if (orderByFiedName != null && orderByFiedName.length() > 0) {
strWhere += " order by a." + orderByFiedName + " "
+ orderby;
}
} else {
// 不带条件
// 带排序
if (orderByFiedName != null && orderByFiedName.length() > 0) {
strWhere += " order by a." + orderByFiedName + " "
+ orderby;
}
}
try {
Query query = session.createQuery(strWhere);
if (where != null) {// 给where参数负值
Set<Map.Entry> set = where.entrySet();
int i = 0;
for (Entry entry : set) {
if (entry.getValue().getClass() == java.sql.Date.class) {
query.setParameter(i, entry.getValue(),
Hibernate.DATE);
} else if (entry.getValue().getClass() == java.sql.Timestamp.class) {
query.setParameter(i, entry.getValue(),
Hibernate.TIMESTAMP);
} else if (entry.getValue().getClass() == java.sql.Time.class) {
query.setParameter(i, entry.getValue(),
Hibernate.TIME);
} else {
query.setParameter(i, entry.getValue());
}
i++;
}
}
list = query.setFirstResult((curPage - 1) * pageSize)
.setMaxResults(pageSize).list();
return list;
} catch (HibernateException e) {
e.printStackTrace();
return null;
}
}
});
}
public List getObjectByPage( final Class clazz, final Integer curPage,
final Integer pageSize, final Map where, final OrderBy orderby,
final String orderByFiedName) {
return getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
List list = new ArrayList();
String strWhere = "from " + clazz.getName() + " as a";
if (where != null) {
// 代条件
//entrySet() 返回此映射中包含的映射关系的 set 视图。
Set<Map.Entry> set = where.entrySet();
strWhere += " where ";
for (Entry e : set) {
strWhere += " a." + e.getKey() + " = ?" + " and ";
}
//boolean endsWith(String suffix)
// 测试此字符串是否以指定的后缀结束
if (strWhere.endsWith(" and ")) {
strWhere = strWhere.substring(0, strWhere
.lastIndexOf(" and "));
}
// 代排序
if (orderByFiedName != null && orderByFiedName.length() > 0) {
strWhere += " order by a." + orderByFiedName + " "
+ orderby;
}
} else {
// 不带条件
// 带排序
if (orderByFiedName != null && orderByFiedName.length() > 0) {
strWhere += " order by a." + orderByFiedName + " "
+ orderby;
}
}
try {
Query query = session.createQuery(strWhere);
if (where != null) {// 给where参数负值
Set<Map.Entry> set = where.entrySet();
int i = 0;
for (Entry entry : set) {
if (entry.getValue().getClass() == java.sql.Date.class) {
query.setParameter(i, entry.getValue(),
Hibernate.DATE);
} else if (entry.getValue().getClass() == java.sql.Timestamp.class) {
query.setParameter(i, entry.getValue(),
Hibernate.TIMESTAMP);
} else if (entry.getValue().getClass() == java.sql.Time.class) {
query.setParameter(i, entry.getValue(),
Hibernate.TIME);
} else {
query.setParameter(i, entry.getValue());
}
i++;
}
}
list = query.setFirstResult((curPage - 1) * pageSize)
.setMaxResults(pageSize).list();
return list;
} catch (HibernateException e) {
e.printStackTrace();
return null;
}
}
});
}
汗,附件上传不了。。。。
我目前对分页方法是对查询进行二次,第一次按条件查出结果集的总行数,已后则用Hibernate的分页策略来查了,这样做的方法好是好,通过我的Pager类,可以方便完成所有分页和查询。
如网友看到此文,希望考虑一下一个地方,那就是用什么好的方式来获得指定条件的结果集总行数,目前我的方法是用单独用一个查询来做。相信有更好的办法,如果您有,望您告诉我哦!