在hibernate操作对象中,entity都做好了映射,查询到的数据能直接赋值到这些entity。
有些时候会用到复杂的联表查询,这时候需要新建一个vo来装联表查询字段的数据。
假设我的查询语句是:
final String sql = "select a.firstname,a.lastname,b.name,b.age from user a right join dog b on a.firstname=b.name order by b.id desc";
新建一个vo,属性和要查询的字段的类型要一致。
public class MultiData {
private String firstname;
private String lastname;
private String name;
private int age;
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
然后dao的实现,中间的service就不写了
@SuppressWarnings("unchecked")
public List<MultiData> getMultiData() {
final String sql = "select a.firstname,a.lastname,b.name,b.age from user a right join dog b on a.firstname=b.name order by b.id desc";
List<MultiData> md = (List<MultiData>) this.hibernateTemplate
.execute(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
// TODO Auto-generated method stub
Query query = session.createSQLQuery(sql)
.setResultTransformer(
Transformers
.aliasToBean(MultiData.class));
return query.list();
}
});
return md;
}
junit测试一下
@Test
public void testGetMultiData() {
List<MultiData> list = this.um.getMultiData();
for (MultiData m : list) {
if (m.getFirstname() == null && m.getLastname() == null) {
System.out.println("user get nullllllllllllllllllll");
}
System.out.println("user : " + m.getFirstname() + " "
+ m.getLastname() + " ------- dog : " + m.getName() + " "
+ m.getAge());
}
}
结果: