关于Example,这个是个比较好的一个可以将一些为0的为null的给过滤出去的方法。
它的无论是对与DetachedCriteria或者对于Criteria都是适用的。
不过不到万一最好还是不要用它。等下再说它的坏处。先说它的用法:
String name = null; DetachedCriteria criteria = DetachedCriteria.forClass(Book.class); User user = userService.findByName("administrator"); List<User> users = Lists.newArrayList(user); /** * 将所有的属性基本都设置一遍 * 需要根据某个条件来查询的都要设置好 * 然后下一步,排除掉其余的属性,一定要全部排除掉,id不用排除 * 就算name为空,但是依然会因为有excludeNone的存在会被过滤掉 */ Book b = new Book(); b.setName(name); b.setUsers(users); Example example = Example.create(b); example.excludeNone(); example.excludeZeroes(); example.excludeProperty("dirPath"); example.excludeProperty("createTime"); example.excludeProperty("updateTime"); criteria.add(example); List<Book> books = bookService.parsel(criteria,page);
public List<Book> parsel(DetachedCriteria criteria, int page) { Session session = (Session) this.entityManager.getDelegate(); Criteria c = criteria.getExecutableCriteria(session); int count = ((Number)(c.setProjection(Projections.rowCount()).uniqueResult())).intValue(); c.setProjection(null); c.setFirstResult((page - 1) * DEFAULT_PAGESIZE); c.setMaxResults(DEFAULT_PAGESIZE); c.setResultTransformer(CriteriaSpecification.ROOT_ENTITY); @SuppressWarnings("unchecked") List<Book> result = c.list(); PaginateSupportArray<Book> paginateList = new PaginateSupportArray<Book>(result,page,DEFAULT_PAGESIZE,count); return paginateList; }
需要注意的是要将除了id以外的属性基本都要排除掉,这个工作很繁琐,当然也可以使用反射来做,但是依然有些繁琐。
但是与其相对应的是它可以很自由的控制哪些需要查询,哪些不需要(很清晰)。
再一个缺点就是,当我们模型中建立了一个Boolean的时候,我们该怎么办呢,是过滤还是不过滤呢?所以就有些不合理。所以用的时候还要保证没有用到Boolean。就凭这一点就掐死了很多使用的希望。所以尽量少用Example。
如果像排除的话,不如自己在前面先判断下:
if(!Strings.isNullOrEmpty(name))criteria.add(Restrictions.like("name",name)); if(propertyId!=0)criteria.createAlias("properties","properties") .add(Restrictions.eq("properties.id",propertyId));