hibernate 利用反射写分页

来源:互联网 发布:淘宝上的胆前级哪个好 编辑:程序博客网 时间:2024/06/10 21:34

import java.util.Date;


import javax.persistence.Table;
import javax.persistence.Transient;


import org.springframework.beans.factory.annotation.Autowired;
@Table
public class Person extends T  {
private Integer id;
private String name;
private Integer age;
private Date createTime;
@Transient
@Autowired
private String sex;
// �޲����Ĺ�����
public Person() {
}


public Integer getId() {
return id;
}


public void setId(Integer id) {
this.id = id;
}


public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}


public Integer getAge() {
return age;
}


public void setAge(Integer age) {
this.age = age;
}


public Date getCreateTime() {
return createTime;
}


public void setCreateTime(Date createTime) {
this.createTime = createTime;
}


@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age
+ ", createTime=" + createTime + "]";
}


public Person(String name, Integer age) {
super();
this.name = name;
this.age = age;
}


public String getSex() {
return sex;
}


public void setSex(String sex) {
this.sex = sex;
}





}




public class Page {
    private int pageSize;
    private int pageCount;
    private int page;
    private int totalCount;
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPageCount() {
return pageCount;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
}

    


import java.util.List;


public class PageResult<E> {
    private List<E> list;
    private Page page;
public List<E> getList() {
return list;
}
public void setList(List<E> list) {
this.list = list;
}
public Page getPage() {
return page;
}
public void setPage(Page page) {
this.page = page;
}
}


/**

     * 分页
     * 
     */
@Override
public List getList( final Page page, final Object objec, List<Order> order) {
String resutlSql="from "+objec.getClass().getSimpleName();
int flag=0;
List<Field> fi = new ArrayList<>() ;
   Class tempClass = Person.class;
   while (tempClass != null) {//当父类为null的时候说明到达了最上层的父类(Object类).
   fi.addAll(Arrays.asList(tempClass .getDeclaredFields()));
         tempClass = tempClass.getSuperclass(); //得到父类,然后赋给自己
   }
for (int i = 0; i < fi.size(); i++) {
String filed=fi.get(i).getName();
fi.get(i).setAccessible(true);
Annotation[] an1 =fi.get(i).getAnnotations();
boolean isTransient=false;
        for (int j = 0; j < an1.length; j++) {
if ((an1[j].annotationType().toString().indexOf("Transient")>=0)){
isTransient=true;
break;
}
}
try {
System.out.println(fi.get(i).get(objec)==null);
if(fi.get(i).get(objec)!=null&&!isTransient){
if(flag==0){
resutlSql+=" where "+filed+"=:"+filed;
flag++;
}else{
resutlSql+=" and "+filed+"=:"+filed;
flag++;
}
}
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


int ListCount=getListCount(null, objec, null);
page.setTotalCount(ListCount);

if(ListCount%page.getPageSize()==0){
page.setPageCount(ListCount/page.getPageSize());
}else{
page.setPageCount(ListCount/page.getPageSize()+1);
}

int orderIndex=0;
for (int i = 0;order!=null&& i < order.size(); i++) {
Order o=order.get(i);
if(orderIndex==0){
resutlSql+=" order by "+o.getOrderKey()+" "+o.getOrderValue();
orderIndex++;
}else{
resutlSql+=" "+o.getOrderKey()+" "+o.getOrderValue();
orderIndex++;
}
}
final String sql=resutlSql;
return getHibernateTemplate().executeWithNativeSession(new HibernateCallback<List<Person>>() {
 
  public List<Person> doInHibernate(Session session) throws HibernateException, SQLException {
  Query query = session.createQuery(sql);
  query.setProperties(objec);
  query.setFirstResult((page.getPage()-1)* page.getPageSize());
  query.setMaxResults(page.getPageSize());
  return query.list();
  }
  });
}

public int getListCount( final Page page, final Object objec, List<Order> order) {
String resutlSql="from "+objec.getClass().getSimpleName();
int flag=0;
resutlSql += getWhere(objec, flag);
final String sql=resutlSql;
return getHibernateTemplate().executeWithNativeSession(new HibernateCallback<Integer>() {
 
  public Integer doInHibernate(Session session) throws HibernateException, SQLException {
  Query query = session.createQuery(sql);
  query.setProperties(objec);
  return query.list().size();
  }
  });
}


private String getWhere(final Object objec, int flag) {
String resutlSql="";
List<Field> fi = new ArrayList<>() ;
   Class tempClass = Person.class;
   while (tempClass != null) {//当父类为null的时候说明到达了最上层的父类(Object类).
   fi.addAll(Arrays.asList(tempClass .getDeclaredFields()));
         tempClass = tempClass.getSuperclass(); //得到父类,然后赋给自己
   }
for (int i = 0; i < fi.size(); i++) {
String filed=fi.get(i).getName();
fi.get(i).setAccessible(true);
Annotation[] an1 =fi.get(i).getAnnotations();
boolean isTransient=false;
        for (int j = 0; j < an1.length; j++) {
if ((an1[j].annotationType().toString().indexOf("Transient")>=0)){
isTransient=true;
break;
}
}
try {
System.out.println(fi.get(i).get(objec)==null);
if(fi.get(i).get(objec)!=null&&!isTransient){
if(flag==0&&resutlSql.indexOf("where")<0){
resutlSql+=" where "+filed+"=:"+filed;
flag++;
}else{
resutlSql+=" and "+filed+"=:"+filed;
flag++;
}
}
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return resutlSql;
}