SSH
hibernte 原生查询
query字段
public List<HouseIdDis> findByDinstance2(double lot,double lat,double dis){
// this.getHibernateTemplate().cr
String sql="select ID,(2 * 6378.137* ASIN(SQRT(POW(SIN(PI()*(111.86141967773438-lat)/360),2)+COS(PI()*33.07078170776367/180)* COS(lat * PI()/180)*POW(SIN(PI()*(33.07078170776367-lon)/360),2)))) as dis FROM houser GROUP BY id HAVING dis<3000";
// sql="select * from houser";
Session s=this.getSessionFactory().getCurrentSession();
Query q=s.createSQLQuery(sql).addScalar("ID", Hibernate.INTEGER).addScalar("dis", Hibernate.DOUBLE);
List<HouseIdDis> hid=new ArrayList<HouseIdDis>();
List l= q.list();
for(int i=0;i<l.size();i++){
HouseIdDis h=new HouseIdDis();
Object[] temp=(Object[]) l.get(i);
h.setId((Integer)temp[0]);
h.setDis((Double)temp[1]);
hid.add(h);
}
return hid;
}
query返回的为二维数组
ID dis
1 2433
2 2433
距离查询新的解决方案。
hbernate查询第一个返回对象 第二个返回简间数据类型
/**
* 根据距离查数据库
* @param dis 公里
* @return 小于给定距离的 id
*/
public String findByDinstance(double lot,double lat,double dis){
// String sql="select house.id,getDistance(LON,'"+lot+"',LAT,'"+lat+"') as dis FROM house GROUP BY id HAVING dis<"+dis;
String sql="select *,getDistance(LON,'"+lot+"',LAT,'"+lat+"') as dis FROM house GROUP BY id HAVING dis<"+dis;
Session s=this.getSessionFactory().getCurrentSession();
// Query q=s.createSQLQuery(sql).addScalar("id",Hibernate.INTEGER).addScalar("dis", Hibernate.DOUBLE);
Query q=s.createSQLQuery(sql).addEntity(HouseBean.class).addScalar("dis", Hibernate.DOUBLE);
List templ=q.list();
JSONArray ja=new JSONArray();
for (int i = 0; i < templ.size(); i++) {
//第一条记录 是一个object数组
Object[] temp=(Object[]) templ.get(i);
HouseBean hb =(HouseBean) temp[0];
double dis2 = (double) temp[1];
JSONObject jo=(JSONObject) JSONValue.parse(hb.toString());
jo.put("dis", dis2);
ja.add(jo);
// System.out.println(hb+"dis");
}
return ja.toJSONString();
}
query对象
sess.createSQLQuery("SELECT * FROM CATS").addEntity(Cat.class);
cat 要有映射的 即对应的bean
注:sessin 不能close(), 框架会管理,关闭会报错的
原生查询使用的表字段为数据的表字段名
而使用hql查询应使用类名 属性名