criterial查询(2014-05-29 03:51)续-----Example

关于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);

dao:

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;
	}

dao层跟以前是一样的,这个不用管什么,主要是controller。

需要注意的是要将除了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));  

这样也行,就是需要不停的判断。


你可能感兴趣的:(criterial)