在使用hibernate过程中有许多查询需要用到sql原生语句进行查询。同时又希望查询结果可以直接保存到POJO对象中。下面给出hibernate的实现方式。
需求: 查询如下表:
[img]http://dl.iteye.com/upload/attachment/0080/5743/3d05c753-841d-3685-8e3c-e88c39762fa1.jpg[/img]
查询结果的同时判断该节点是否是叶子节点(树形结构),可以通过以下查询语句来实现:
1. 对应的树形结构POJO
2. 在查询的过程中注意查询结果列明要和pojo中的元素名相同.如果不一样可以通过as 来进行别名。
需求: 查询如下表:
[img]http://dl.iteye.com/upload/attachment/0080/5743/3d05c753-841d-3685-8e3c-e88c39762fa1.jpg[/img]
查询结果的同时判断该节点是否是叶子节点(树形结构),可以通过以下查询语句来实现:
select
id ,
element_value as 'text',
parent as 'pid',
CASE (
select
count(child.id)
from
element_value_set child
where
child.parent = par.id
)
when 0 then 1
else 0
END as leaf
from
element_value_set par
where
par.parent = ?
1. 对应的树形结构POJO
package com.ruijie.db.hibernate.mapping;
/**
* @author Ext 树结构
*
*/
public class Tree {
private int id;
private int pid;
private String text;
private boolean leaf;
// TODO : 对应的get和set方法
}
2. 在查询的过程中注意查询结果列明要和pojo中的元素名相同.如果不一样可以通过as 来进行别名。
@SuppressWarnings("unchecked")
public List<Tree> getTreeValueByQueryBean(int pid) {
final String sql = "select id ,parent as 'pid',element_value as 'text',case (select count(child.id) from element_value_set child where child.parent = par.id) when 0 then 1 else 0 end as leaf from element_value_set par where par.parent = " + pid;
// 要进行强制转换
List<Tree> tree = (List<Tree>)hibernateTemplate.execute(new HibernateCallback(){
@Override
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
SQLQuery query = session.createSQLQuery(sql);
// 指定查询结果属性类型
query.addScalar("id",Hibernate.INTEGER);
query.addScalar("text", Hibernate.STRING);
query.addScalar("leaf",Hibernate.BOOLEAN);
query.addScalar("pid", Hibernate.INTEGER);
// 进行结果集的转换
query.setResultTransformer(Transformers.aliasToBean(Tree.class));
// 查询结果并且放回
return query.list();
}});
return tree;
}