问题描述
员工信息表(Employee)中存的“机构”,“部门”“职位”字段是存的代码。另外三张字典表存的是代码对应的名字。请问用Hibernate 如何关联这三张字典表,查询出机构,部门,职位对应的名字?并且不用再新建一个类,查询出来的值,直接赋到员工信息表对象中。Employee表结构:id,name,institution,department,position字典表:institution_dict表结构:id,namedepartment_dict表结构:id,nameposition_dict表结构:id,department_name,position_name
解决方案
1、写一个单独的hql 得到相应的数组数据 如[employe对象, 组织名,职位名]2、hibernate forumla 公式解决(你可google下)
解决方案二:
如果 Employee表 中 institution,department,position 存放的是外键的话存放是IDselect e.id,i.name,d.name,p.position_namefrom Employee e left join institution_dict i on e.institution=i.idleft join department_dict d on e.department on d.idleft join position_name p on e.position=p.id;用了hibernate 应该面向对象去设计类了貌似这样设计类:class Employeepublicint id;public String name;public Institution institution;public Position position;class Institutionpublicint id;public String name;class Departmentpublicint id;public String name;class Positionpublicint id;public Department department;public String name;那么这个hql可以这样写了select e.name,e.name,e.institution.name,e.position.department.name,e.position.name from Employee e
解决方案三:
写一个hql查询出联表的字段名称,并给关联表的字段名称取一个别名和员工类的非数据映射字段名称相同。String hql="select i.name as iname,d.name as dname,p.position_name as pname from Employee as e left join e.Institutio as i left jion e.Department as d left join e.Position as p where e.id =? ";Query query=super.getSession().createQuery(buffer.toString());query.setResultTransformer(new AliasToBeanResultTransformer(Employee.class));return query.uniqueResult();这样便可用一条sql一次把你要的数据查出来,封装成对应的字段。
解决方案四:
以上答案都是说用sql、hql解决,或者是forumla解决,当然这些都绝对正确。为什么不换个思路呢。一般这种字典表在项目中各个模块都可能用到,不可能每个模块都要这么做。业务的orm不用管这些字典数据,直接传到web前端。前端统一通过字典映射的自定义标签来转换。自定义标签通过缓存查找字典数据,然后输出到web前端。这样不管是表单输入、或者是查询统计,直接通过自定义标签来完成。这也是很多基础平台需要做的事情。如果是业务模块少,可以按照楼上几位的方案,直接在orm解决。
解决方案五:
使用hql的视图查询 如 select new com.msy.test.bean.User(t.name , r.name) from User t , Role r where ... 前提是你的User实体有类似 public User(String uname , String rname) 的构造方法 并且继承 java.io.Serializable接口
解决方案六:
我觉得你的描述好像是两个问题1 如何进行关联查询 select i.name,d.name,p.position_name from Employee as e left join e.Institutio as i left jion e.Department as d left join e.Position as p where e.id =?2 查询出来的值,直接赋到员工信息表对象中 当插入的时候,这个时候的值是从前台传递进来的,也就是Institutio的id、Department的id、Position的id