hibernate使用原生的sql,解決管理查詢、結果集封裝等問題
阿新 • • 發佈:2019-01-24
前提: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);
}
再遍歷,拿到你想要的就行了。