推举利用getHibernateTemplate().executeWithNativeSession() +SQLQuery方法。
下面我用自己写的代码为例,进行说明。
下面是dao层的我写的一段代码,供参考
/**
* 查询卡等级
* @author yangliang
* @created 2011-11-24 下午05:31:33
*/
@SuppressWarnings("unchecked")
@Override
public List queryCardGrade() {
final String sql = "select t.ID id,t.NAME name,TC.PRIORITY_C priorityC from T_CARD_GRADE t,T_CARD_GRADE_CSTM TC where t.ID=TC.ID_C and t.DELETED=0";
List<CardGradeApi> gradeList = (List<CardGradeApi>) getHibernateTemplate()
.executeWithNativeSession(new HibernateCallback<Object>() {
@Override
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
return session
.createSQLQuery(sql)
.addScalar("id")
.addScalar("name")
.addScalar("priorityC")
.setResultTransformer(
Transformers
.aliasToBean(CardGradeApi.class))
.list();
}
});
if (null != gradeList) {
System.out.println(gradeList.size());
}
return gradeList;
说明:在进行多表查询时,可以将需要的字段定义成一个对象(如CardGradeApi),对象里面的属性对应sql语句中查询的字段的别名。
定义的对象代码如下:
/**
* 查询出来的卡等级对象信息
*
* @author yangliang
* @version 1.0
* @created 2011-11-24 下午05:38:30
* @history
* @see
*/
public class CardGradeApi {
private String id ;
private String name;
private BigDecimal priorityC;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public BigDecimal getPriorityC() {
return priorityC;
}
public void setPriorityC(BigDecimal priorityC) {
this.priorityC = priorityC;
}
}
关于Hibernate查询的各种方式效率比较,可以参考网上这篇文章:http://ld.ldyef.org.cn/gongsi/543.html
请大家指出不足之后,进行交流,我的邮箱:576017120@qq.com
类型转换类型出现错误的时候,可以这样做:.addScalar("pointsC",new FloatType())===,以前用过,不过这次为了不报这个类型错误,我找了好久,最后还是通过找到自己以前写的代码才找到怎么解决的,诶。