通过代码生成机制的appfuse访问数据都通过GenericManager来实现,GenericManager默认提供了以下几个方法:

 package org.appfuse.service;

 import java.io.Serializable;
import java.util.List; /**
* Generic Manager that talks to GenericDao to CRUD POJOs.
*
* <p>Extend this interface if you want typesafe (no casting necessary) managers
* for your domain objects.
*
* @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
* Updated by jgarcia: added full text search + reindexing
* @param <T> a type variable
* @param <PK> the primary key for that type
*/
public interface GenericManager<T, PK extends Serializable> { /**
* Generic method used to get all objects of a particular type. This
* is the same as lookup up all rows in a table.
* @return List of populated objects
*/
List<T> getAll(); /**
* Generic method to get an object based on class and identifier. An
* ObjectRetrievalFailureException Runtime Exception is thrown if
* nothing is found.
*
* @param id the identifier (primary key) of the object to get
* @return a populated object
* @see org.springframework.orm.ObjectRetrievalFailureException
*/
T get(PK id); /**
* Checks for existence of an object of type T using the id arg.
* @param id the identifier (primary key) of the object to get
* @return - true if it exists, false if it doesn't
*/
boolean exists(PK id); /**
* Generic method to save an object - handles both update and insert.
* @param object the object to save
* @return the updated object
*/
T save(T object); /**
* Generic method to delete an object
* @param object the object to remove
*/
void remove(T object); /**
* Generic method to delete an object based on class and id
* @param id the identifier (primary key) of the object to remove
*/
void remove(PK id); /**
* Generic method to search for an object.
* @param searchTerm the search term
* @param clazz type of class to search for.
* @return a list of matched objects
*/
List<T> search(String searchTerm, Class clazz);
/**
* Generic method to regenerate full text index of the persistent class T
*/
void reindex(); /**
* Generic method to regenerate full text index of all indexed classes
*
* @param async
* true to perform the reindexing asynchronously
*/
void reindexAll(boolean async);
}

GenericManager

通常我们用getAll()访问表中所有的数据,可惜无排序;用search(String searchTerm, Class clazz)来过滤数据,可惜不能自定义条件,只能全字段搜索。

下面是我在开发过程中扩展出来的几个方法,直接附上GenericDaoHibernate中的实现,各层的声明就没再累赘。

1. 自定义排序的getAll

  public List<T> getAll(String order) {
Session sess = getSession();
Criteria criteria = sess.createCriteria(persistentClass);
criteria.addOrder(Order.desc(order));
System.out.println(criteria);
return criteria.list();
}

getAll

2. 自定义HQL语句的查询

  public List<T> selectDataByHql(String hql) {
Session session = getSession();
Query query=session.createQuery(hql);
//执行查询,返回对象集合
List<T> allClasses = query.list();
return allClasses;
}

selectDataByHql

3. 根据某一列字段精确匹配的数据,并可排序,比如State=1

 public List<T> search(String property,Object value,String order) throws SearchException {
Session sess = getSession();
Criteria cri= sess.createCriteria(persistentClass);
if(StringUtils.isNotBlank(order)){
cri.addOrder(Order.desc(order));
}
cri.add(Restrictions.eq(property,value));
return cri.list();
}

search

4. 自定义条件的查询

 public List<T> search(Criterion query,String order) throws SearchException {
Session sess = getSession();
Criteria cri= sess.createCriteria(persistentClass);
if(StringUtils.isNotBlank(order)){
cri.addOrder(Order.desc(order));
}
cri.add(query);
return cri.list();
}

search

有人可能疑问为啥定义了4,还要再定义2呢,只能说编码风格的问题,我喜欢用4的方式,但有人喜欢HQL语句,觉得更加直观。

Appfuse:扩展自己的GenericManager的更多相关文章

  1. Appfuse:记录操作日志

    appfuse的数据维护操作都发生在***form页面,与之对应的是***FormController,在Controller中处理数据的操作是onSubmit方法,既然所有的操作都通过onSubmi ...

  2. 使用 AppFuse 的七个理由

    mvn -e  archetype:generate -B -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfus ...

  3. Asp.net Boilerplate之AbpSession扩展

    当前Abp版本1.2,项目类型为MVC5. 以属性的形式扩展AbpSession,并在"记住我"后,下次自动登录也能获取到扩展属性的值,版权归"角落的白板报"所 ...

  4. 恢复SQL Server被误删除的数据(再扩展)

    恢复SQL Server被误删除的数据(再扩展) 大家对本人之前的文章<恢复SQL Server被误删除的数据> 反应非常热烈,但是文章里的存储过程不能实现对备份出来的日志备份里所删数据的 ...

  5. .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

    .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...

  6. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...

  7. 采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)

    前言 Entity Framework 延伸系列目录 今天我们来讲讲EntityFramework.Extended 首先科普一下这个EntityFramework.Extended是什么,如下: 这 ...

  8. Dapper扩展之~~~Dapper.Contrib

    平台之大势何人能挡? 带着你的Net飞奔吧!http://www.cnblogs.com/dunitian/p/4822808.html#skill 上一篇文章:Dapper逆天入门~强类型,动态类型 ...

  9. ExtJS 4.2 Date组件扩展:添加清除按钮

    ExtJS中除了提供丰富的组件外,我们还可以扩展他的组件. 在这里,我们将在Date日期组件上添加一个[清除]按钮,用于此组件已选中值的清除. 目录 1. Date组件介绍 2. 主要代码说明 3. ...

随机推荐

  1. MVVM大比拼小结

    目前完成4篇源码分析文章: MVVM大比拼之knockout.js源码精析 MVVM大比拼之avalon.js源码精析 MVVM大比拼之vue.js源码精析 MVVM大比拼之AngularJS源码精析 ...

  2. ASP.NET Web API Model-ParameterBinding

    ASP.NET Web API Model-ParameterBinding 前言 通过上个篇幅的学习了解Model绑定的基础知识,然而在ASP.NET Web API中Model绑定功能模块并不是被 ...

  3. DAO层,Service层,Controller层、View层 的分工合作

    DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口 ...

  4. The type javax.ws.rs.core.MediaType cannot be resolved. It is indirectly referenced from required .class files

    看到了http://stackoverflow.com/questions/5547162/eclipse-error-indirectly-referenced-from-required-clas ...

  5. node之path模块

    node之path模块 原文链接 //引用该模块 var path = require("path"); 1.路径解析,得到规范化的路径格式 对window系统,目录分隔为'', ...

  6. MailKit---状态更改和删除

    当我们拉取邮件列表,并展示邮件后需要打开邮件,同时标识本邮件状态为已读状态,或者我们直接删除邮件.下面介绍基本的应用. 首先了解邮件的所有枚举状态:MailKit.MessageFlags包括:(No ...

  7. 【.NET深呼吸】元组数据(Tuple)

    各位观众,大家好,欢迎收看由火星电视台直播的<老周吹牛>节目,注意:本节目没有任何技术含量,如果您没有兴趣,请砸掉电视机. 今天说一下System命名空间下的一个数据类型——Tuple,翻 ...

  8. Asp.net中存储过程拖拽至dbml文件中,提示无法获得返回值

    Asp.net中存储过程拖拽至dbml文件中,提示无法获得返回值,去属性表中设置这时候会提示你去属性表中更改返回类型. 其实存储过程返回的也是一张表,只不过有时候存储过程有点复杂或者写法不规范的话不能 ...

  9. SharePoint 2013 create workflow by SharePoint Designer 2013

    这篇文章主要基于上一篇http://www.cnblogs.com/qindy/p/6242714.html的基础上,create a sample workflow by SharePoint De ...

  10. 你真的会玩SQL吗?让人晕头转向的三值逻辑

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...