四、hibernate的持久层操作(多条件语句查询)

版权声明:本篇文章由IT_CREATE整理 https://blog.csdn.net/IT_CREATE/article/details/87386592

以下全部是单向关系

hibernate多条件查询语句:(传入对象)

一、用hql语句进行多条件语句查询:(返回对象的list集合)

在hql语句中,select后面用不管是new对象,还是new map,只要在new之中指定了字段,它就只会去查询这些字段。

public List<?> findUserBeanByObject(UserBean user) {
      // --------------------------------------------------------
      // ----------使用Query完成多条件查询(明显的缺陷:需要拼接语句)--------
      // --------------------------------------------------------
		
      //select 字段列表 from 表 where 条件 
      String hql = "select new UserBean(u.loginName,u.userName,u.age) From UserBean as u where u.userName like concat(:userName,'%') and u.gender = :gender"; 
      Query query = session.createQuery(hql);//产生一个Query接口的实例,并针对HQL进行预编译
      query.setString("userName", user.getUserName()); 
      query.setInteger("gender",user.getGender());
    
      //setProperties 在一次性设值时,需要条件是:HQL语句中参数的名称,必须要在对象的属性中可以找得到
      //query.setProperties(user); 
      return query.list();
}

返回map类型的list集合:

public List<?> findUserBeanByObject(UserBean user) {
      // --------------------------------------------------------
      // ----------使用Query完成多条件查询(明显的缺陷:需要拼接语句)--------
      // --------------------------------------------------------
		
      String hql ="select new map(u.loginName as loginName,u.userName as userName,u.age as age) From UserBean as u where u.userName like concat(:userName,'%') and u.gender = :gender"; 
      Query query = session.createQuery(hql);//产生一个Query接口的实例,并针对HQL进行预编译
      // query.setString("userName", user.getUserName()); 
      //query.setInteger("gender", user.getGender());
      //setProperties 在一次性设值时,需要条件是:HQL语句中参数的名称,必须要在对象的属性中可以找得到
      query.setProperties(user); 
      return query.list();
}

二、利用Criteria来拼接语句

public List<?> findUserBeanByObject(UserBean user) {
		// TODO Auto-generated method stub
		// --------------------------------------------------------
		// --------------使用Criteria完成多条件查询---------------------
		// --------------------------------------------------------
		Criteria criteria = session.createCriteria(UserBean.class);// From UserBean where 1=1
		if (!StringUtils.isEmpty(user.getLoginName())) {
			criteria.add(Restrictions.eq("loginName", user.getLoginName()));// and loginName = '"+user.getLoginName()+"'
		}
		if (!StringUtils.isEmpty(user.getUserName())) {
			criteria.add(Restrictions.like("userName", user.getUserName(), MatchMode.START));// and userName like concat('"+user.getUserName()+"','%')
		}

		// Integer [] gender = {0,1};
		// criteria.add(Restrictions.in("gender", gender));//in (,,,,,)

		criteria.add(Restrictions.or(Restrictions.eq("gender", 0), Restrictions.eq("gender", 1)));

		criteria.add(Restrictions.between("age", 18, 60));// between …… and ……

		criteria.addOrder(Order.desc("createTime"));// 按照创建时间降序排列

		return criteria.list();
}

hibernate多条件查询语句:(传入map)

如果传入的是map,那么map中键的名字必须和hql语句中“:参数名”的参数名一致,才能在预编译后赋值生效。在这里,也就是说,map中有两个键,userName和gender

@Override
public List<?> findUserBeanByMap(Map map) {
	// TODO Auto-generated method stub
	String hql = "select new map(u.loginName as loginName,u.userName as userName,u.age as age) From UserBean as u where u.userName like concat(:userName,'%') and u.gender = :gender";
	Query query = session.createQuery(hql);// 产生一个Query接口的实例,并针对HQL进行预编译

	// query.setString("userName", user.getUserName());
	// query.setInteger("gender", user.getGender());

	// setProperties 在一次性设值时,需要条件是:HQL语句中参数的名称,必须要在Map中的键中可以找得到
	query.setProperties(map);
	return query.list();
}

返回PageBean数据:(PageBean代码见最后,PageBean就是分页数据)

一、利用hql

@Override
public PageBean findUserBeanList2PageBean(PageBean page, UserBean user) {

    // --------------------------------------------------------
    // ----------使用Query完成多条件查询(明显的缺陷:需要拼接语句)--------
    // --------------------------------------------------------

    String hql = "select count(*) from UserBean as u where u.userName like concat(:userName,'%') and u.gender = :gender";
    Query query = session.createQuery(hql); 
    query.setProperties(user);

    //uniqueResult()表示返回一个唯一的结果 
    long totalRows = (long) query.uniqueResult();
    List<?> datas = null; 
    if(totalRows > 0) { 
        hql = "from UserBean as u where u.userName like concat(:userName,'%') and u.gender = :gender"; 
        query = session.createQuery(hql); 
        query.setProperties(user);
    
        //设置数据库中查询起始位置、获取的数据条数 
        query.setFirstResult(page.getIndex());
        query.setMaxResults(page.getRows()); 
        datas = query.list(); 
    }
    page.setTotalRows(totalRows); 
    page.setData(datas); 
    return page;

}

二、利用Criteria

@Override
public PageBean findUserBeanList2PageBean(PageBean page, UserBean user) {
	// TODO Auto-generated method stub
	// --------------------------------------------------------
	// --------------使用Criteria完成多条件查询---------------------
	// --------------------------------------------------------
	Criteria criteria = session.createCriteria(UserBean.class);// From UserBean where 1=1
	if (!StringUtils.isEmpty(user.getLoginName())) {
		criteria.add(Restrictions.eq("loginName", user.getLoginName()));// and loginName = '"+user.getLoginName()+"'
	}
	if (!StringUtils.isEmpty(user.getUserName())) {
		criteria.add(Restrictions.like("userName", user.getUserName(), MatchMode.START));// and userName like concat('"+user.getUserName()+"','%')
	}
	if (user.getGender() != null) {
		criteria.add(Restrictions.eq("gender", user.getGender()));
	}
	if (user.getBirthday() != null) {
		criteria.add(Restrictions.ge("birthday", user.getBirthday()));
	}

	// 添加投影
	criteria.setProjection(Projections.rowCount());// 我在From UserBean之上 添加了一个select count(*)
	long totalRows = (long) criteria.uniqueResult();// 获得多少条
	List<?> datas = null;
	if (totalRows > 0) {
		// 去掉投影
		criteria.setProjection(null);
		criteria.setFirstResult(page.getIndex());
		criteria.setMaxResults(page.getRows());
		datas = criteria.list();
	}
	page.setTotalRows(totalRows);
	page.setData(datas);
	return page;
}

对于关联关系

一、利用hql

hql语句中fetch的作用是将关联表查出来的数据直接装配进主对象中(这里就是userInfo对象装进UserBean)

@Override
public List<?> findUserBeanByIdcardAndAddress(String idcard, String address) {
		
	// --------------------------------------------------------
	// ----------使用Query完成多条件查询(明显的缺陷:需要拼接语句)--------
	// --------------------------------------------------------
	//fetch 表示将关联对象,查询出来的结果,装配到主对象身上,并从返回结果集中移除关联对象,只返回主对象
		
	//如果需要使用new map()来完成多表之间的按需查询,请删除fetch关键字
	String hql = "From UserBean as u left join fetch u.userInfo as i where i.idcard like concat(:idcard,'%')";
	Query query = session.createQuery(hql);
	query.setString("idcard", idcard);
	return query.list();
}

二、利用Criteria

@Override
public List<?> findUserBeanByIdcardAndAddress(String idcard, String address) {
	// TODO Auto-generated method stub
		
	// --------------------------------------------------------
	// --------------使用Criteria完成多条件查询---------------------
	// --------------------------------------------------------
	Criteria criteria = session.createCriteria(UserBean.class);//From UserBean as u where 1=1
	//关联对象查询,给关联对象取别名,并且完成两个对象之间的关联
	criteria.createAlias("userInfo", "i",JoinType.LEFT_OUTER_JOIN);
	criteria.createAlias("adds", "a",JoinType.LEFT_OUTER_JOIN);
		
	if(!StringUtils.isEmpty(idcard)) {
		criteria.add(Restrictions.like("i.idcard", idcard,MatchMode.START));
	}
	if(!StringUtils.isEmpty(address)) {
		criteria.add(Restrictions.like("a.address", address,MatchMode.START));
	}
		
	return criteria.list();

}

PageBean:

package com.ge.hibernatexml.bean;

import java.util.List;

/**
 * 分页对象
 * @author Administrator
 *
 */
public class PageBean {

	private int page;//当前页码
	private int rows;//每页显示数据的行数
	
	private int index;//数据获取的起始位置(数据库中)
	private long totalRows;//数据总条数
	private long totalPage;//总共有多少页
	
	private String sort;//排序字段
	private String order;//排序方式
	
	//具体的数据
	private List<?> data;

	
	public PageBean() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	public PageBean(int page, int rows) {
		super();
		this.page = page;
		this.rows = rows;
		//计算数据获取的起始位置
		this.index = (page - 1) * rows;
	}


	public int getPage() {
		return page;
	}

	public void setPage(int page) {
		this.page = page;
	}

	public int getRows() {
		return rows;
	}

	public void setRows(int rows) {
		this.rows = rows;
	}

	public int getIndex() {
		return index;
	}

	public void setIndex(int index) {
		this.index = index;
	}

	public long getTotalRows() {
		return totalRows;
	}

	public void setTotalRows(long totalRows) {
		this.totalRows = totalRows;
		//总页码
		this.totalPage = totalRows % rows == 0 ? totalRows / rows : totalRows / rows + 1;
	}

	public String getSort() {
		return sort;
	}

	public void setSort(String sort) {
		this.sort = sort;
	}

	public String getOrder() {
		return order;
	}

	public void setOrder(String order) {
		this.order = order;
	}

	public long getTotalPage() {
		return totalPage;
	}

	public void setTotalPage(long totalPage) {
		this.totalPage = totalPage;
	}

	public List<?> getData() {
		return data;
	}

	public void setData(List<?> data) {
		this.data = data;
	}

	@Override
	public String toString() {
		return "PageBean [page=" + page + ", rows=" + rows + ", index=" + index + ", totalRows=" + totalRows
				+ ", totalPage=" + totalPage + ", sort=" + sort + ", order=" + order + ", data=" + data + "]";
	}
}

猜你喜欢

转载自blog.csdn.net/IT_CREATE/article/details/87386592