版权声明:本篇文章由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 + "]";
}
}