1.由于SQL语法本身的复杂,及各种数据库原生功能的多样性,HQL和QBC不能涵盖所有的查询特性,这时就需要采用原生的SQL达到期望的目的。Hibernate 完全支持直接使用数据库SQL语言进行查询,并将查询结果进行了简单的封装。不必再对ResultSet进行烦琐的操作,因为查询结果依然是由持久化对象的集合。仍然可以用面向对象的思想进行编程。
2.Hibernate 为执行本地查询提供了专门的方法,及Session的createSQLQuery(String sql),参数就是要执行的sql 语句,返回类型为Query 类型的实例.
3.以下是通过关联查询,将查询结果直接映射到非Hibernate管理的bean类PropListVO.class上方便取用。
//以下示例代码
public List queryByNativeSQL(String typeId){
try {
String queryString = "select a.type_Id typeId,a.type_Name typeName,b.list_Name listName,b.list_Id listId from Prop_Type as a,Prop_List as b where a.type_Id = b.type_Id and a.type_Id " + "= ?";
Query queryObject = getSession().createSQLQuery(queryString)
.addScalar("typeId")//明确指定bean属性名返回值:名称,类型,不限制必须大写
.addScalar("typeName",Hibernate.STRING)
.addScalar("listName")//对全部或者部分的标量值不设置数据类型信息也是可以的
.addScalar("listId")
.setResultTransformer(Transformers.aliasToBean(PropListVO.class));
queryObject.setParameter(0, typeId);
return queryObject.list();
} catch (RuntimeException re) {
log.error("find by property name failed", re);
throw re;
}finally{
HibernateSessionFactory.closeSession();
}
}
//以下是bean 类
public class PropListVO {
private String typeId;
private String typeName;
private String listName;
private String listId;
/**
* @return the typeId
*/
public String getTypeId() {
return typeId;
}
/**
* @param typeId the typeId to set
*/
public void setTypeId(String typeId) {
this.typeId = typeId;
}
/**
* @return the typeName
*/
public String getTypeName() {
return typeName;
}
/**
* @param typeName the typeName to set
*/
public void setTypeName(String typeName) {
this.typeName = typeName;
}
/**
* @return the listName
*/
public String getListName() {
return listName;
}
/**
* @param listName the listName to set
*/
public void setListName(String listName) {
this.listName = listName;
}
/**
* @return the listId
*/
public String getListId() {
return listId;
}
/**
* @param listId the listId to set
*/
public void setListId(String listId) {
this.listId = listId;
}
}