现在的位置: 首页 > 综合 > 正文

用泛型与反射技术封装分页功能(JPA)

2018年05月23日 ⁄ 综合 ⁄ 共 4095字 ⁄ 字号 评论关闭
DAO.java
  public interface DAO {
  /**
  * 1.获取所要显示的分页数据(一般以list形式来存放)
  * 2.获取记录的总数(计算总页数)
  * 3.需要定义一个返回类型,获取两个参数
  * @param <T>
  * @param entityClass 实体类
  * @param firstindex 开始索引
  * @param maxresult 需要获取记录数
  * @return
  */
  public <T> QueryResult<T> getScrollData(Class<T> entityClass, int firstindex, int maxresult);}
  QueryResult.java(需要定义一个返回类型,获取两个参数)
  package com.itcast.bean;
  import java.util.List;
  public class QueryResult<T> {
  private List<T> resultlist;
  private long totalrecord;
  public List<T> getResultlist(){
  return resultlist;
  }
  public void setResultlist(List<T> resultlist) {
  this.resultlist = resultlist;
  }
  public long getTotalrecord() {
  return totalrecord;
  }
  public void setTotalrecord(long totalrecord) {
  this.totalrecord = totalrecord;
  }
  }
  DaoSupport.java
  import com.itcast.bean.QueryResult;
  public abstract class DaoSupport implements DAO {
  @SuppressWarnings("unchecked")
  @Override
  @Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)
  public <T> QueryResult<T> getScrollData(Class<T> entityClass, int firstindex, int maxresult) {
  //创建查询对象
  QueryResult qr = new QueryResult<T>();
  //获取实体名称
  String entityname = getEntityName(entityClass);
  Query query = em.createQuery("select o from "+entityname+" o");
  query.setFirstResult(firstindex).setMaxResults(maxresult);
  qr.setResultlist(query.getResultList());
  query = em.createQuery("select count(o) from "+entityname+" o");
  qr.setTotalrecord((Long)query.getSingleResult());
  return qr;
  }
  /**
  * 获取实体名称
  * @param <T>
  * @param entityClass实体类
  * @return
  */
  protected <T> String getEntityName(Class<T> entityClass){
  String entityname = entityClass.getSimpleName();
  Entity entity = entityClass.getAnnotation(Entity.class);
  if(entity.name()!=null && !"".equals(entity.name())){
  entityname = entity.name();
  }
  return entityname;
  }
  }

@Test
	public void scrollDataTest() {
		
		QueryResult<ProductType> qr = productService.getStrollData(ProductType.class, 0, 5);
		for(ProductType t : qr.getResultList()){
			System.out.println(t.getName());
		}
	}

package com.bean.product;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
@Entity
public class ProductType implements Serializable {
	
	/**
	 * 实体bean应用到ejb3,便于网络传送。
	 */
	private static final long serialVersionUID = -3711997324115011724L;
	private Integer typeid;
	private String name;
	//google 描述
	private String note;
	private boolean visible = true;
	//子类别
	private Set<ProductType> childTypes = new HashSet<ProductType>(); 
	//父类别
	private ProductType parent;
	
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	public Integer getTypeid() {
		return typeid;
	}

	public void setTypeid(Integer typeid) {
		this.typeid = typeid;
	}
	@Column(length = 36 , nullable = false)
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	@Column(length = 300)
	public String getNote() {
		return note;
	}

	public void setNote(String note) {
		this.note = note;
	}
	@Column(nullable = false)
	public boolean isVisible() {
		return visible;
	}

	public void setVisible(boolean visible) {
		this.visible = visible;
	}
	@OneToMany(cascade = {CascadeType.REFRESH,CascadeType.REMOVE}, mappedBy="parent")
	public Set<ProductType> getChildTypes() {
		return childTypes;
	}
	
	public void setChildTypes(Set<ProductType> childTypes) {
		this.childTypes = childTypes;
	}
	//false:不是可选的=必须要有。true是可选的,可以没有。默认下为true
	@ManyToOne(cascade = (CascadeType.REFRESH),optional = true )
	@JoinColumn(name="parentid")
	public ProductType getParent() {
		return parent;
	}

	public void setParent(ProductType parent) {
		this.parent = parent;
	}

	/* 对象之间的比较,所以需要重写hashCode and equals
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((typeid == null) ? 0 : typeid.hashCode());
		return result;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		ProductType other = (ProductType) obj;
		if (typeid == null) {
			if (other.typeid != null)
				return false;
		} else if (!typeid.equals(other.typeid))
			return false;
		return true;
	}
	

}

抱歉!评论已关闭.