1. 程式人生 > >hibernate使用原生的sql,解決管理查詢、結果集封裝等問題

hibernate使用原生的sql,解決管理查詢、結果集封裝等問題

前提:hibernate的public List<Aorder> findByExample(Aorder instance){xxxx}方法,是不支援管理查詢的。只能寫sql自己查。

@Entity
@Table(name = "aorder", catalog = "console")
public class Aorder implements java.io.Serializable {

	// Fields

	private Integer oid;
	private Auser auser;//hibernate反向工程,多對一;結果在多的一方生成了一的實體auser,在一的一方生成了多的一方的集合List<aorder>;
	private Integer version;
	private Timestamp creation;
	private Timestamp lastModified;
	private String name;
	private String type;
	private Boolean removed;
	private Double totalBudget;
	private String contractNo;
	private String convertPoint;
	private String kpiType1;
	private Double price1;
	private String kpiType2;

1、封裝實體bean

public class NativeSQLBean {

	 private Aideas aidea;
	 private Aorder aorder;
	 private Areasreport areasreport;
	 private Auser auser;
	 private Hoursreport hoursreport;
	 private PlanStrategy planStrategy;
	public Aideas getAidea() {
		return aidea;
	}
	public void setAidea(Aideas aidea) {
		this.aidea = aidea;
	}//get set方法,此處省略

2、aorderDao,dao層的查詢方法

//根據uid查詢
	public List<Aorder> findByModel(Integer uid){
		try {
			List<Aorder> aolist=new ArrayList<Aorder>();
			 String hql="select o.*,a.* from aorder o left join auser a on a.uid=o.uid where o.uid= "+uid;

			 Query query=this.getSession().createSQLQuery(hql).addEntity(Aorder.class).addEntity(Auser.class);
			 query.setResultTransformer(Transformers.aliasToBean(NativeSQLBean.class));
			List<NativeSQLBean> results= (List<NativeSQLBean>) query.list();
			for (NativeSQLBean nativeSQLBean : results) {
				Aorder a=nativeSQLBean.getAorder();
				aolist.add(a);
			}
			return aolist;
		} catch (HibernateException e) {
			throw e;
		}
	}


  解釋:查詢的結果是Object陣列。(Transformers.aliasToBean(NativeSQLBean.class),這個方法可以轉化list<object> 和map<string(實際是類名),object>、封裝實體bean三種。

debug顯示的資料結構,可以看到,管理查詢的結果全部封裝到了寫好的實體bean中了。

	List<Aorder> aolist=new ArrayList<Aorder>();
          for (NativeSQLBean nativeSQLBean : results) {
                        Aorder a=nativeSQLBean.getAorder();aolist.add(a);
             }
再遍歷,拿到你想要的就行了。