Java中使用hql,sql查询--多表查询后的新实体构建方法详解
2013-07-02 21:38
489 查看
需要将Query对象setResultTransformer:List list = session.createSQLQuery(sql).setResultTransformer(
Transformers.ALIAS_TO_ENTITY_MAP).list();
//此时,每个Object可以转换成一个Map
Map map = (Map) list.get(i);
map.get("PARENT_ID"); //这里的key 一定是 数据库对应的字段名才行 例如:[java]view plaincopy<span style="font-family:Microsoft YaHei;font-size:13px;">// 查询出数据
String hql = "select a.id as emergencyBasExeId,a.LEVEL as level,a.SEND_TIME as sender_time,a.NAME as name,a.CONTENT as content " +
",a.PROCESS_ID as processId,m.STATES as states,m.id as id,m.emergencyInfoSecondMgr.id as emergencySencondMgrId " +
" from EmergencyInfoFirstExe a, EventManage m where a.deleteFlag = 0 and a.id=m.emergencyInfoFirstExe.id ";
// 查询出数据list
List exeList = eventManageDao.notifyHqlPage(hql, pageNumber * pageSize, pageSize);
// 返回所需要的数据List
List<EventInfoView> reList = new ArrayList<EventInfoView>();
//map.get("PARENT_ID"); //这里的key 一定是 数据库对应的字段名才行
//对返回List的数据封装
for(Object exe : exeList){
EventInfoView event = new EventInfoView();
//此时,每个Object可以转换成一个Map
Map map=(Map)exe;
//然后可以使用map.get("属性名");即可取值
event.setId(map.get("id").toString());
event.setContent(map.get("content").toString());
event.setEmergencyBasExeId(map.get("emergencyBasExeId").toString());
event.setEmergencySencondMgrId(map.get("emergencySencondMgrId").toString());
event.setEmergencyTitle(map.get("emergencyTitle").toString());
event.setLevel(map.get("level").toString());
event.setName(map.get("name").toString());
event.setProcessId(map.get("processId").toString());
event.setProcessName(map.get("processName").toString());
event.setSender_time(map.get("sender_time").toString());
event.setStates(map.get("states").toString());
//....
reList.add(event);
}
</span>
上面的方法经过验证无效!!!==============================第二种方法==============================hql查询单表部分字段:在hibernate中,用hql语句查询实体类,采用list方法的返回结果为一个List,该List中封装的对象分为以下三种情况:1.查询全部字段的情况下,如"from 实体类",list中封装的对象为实体类本身,各属性都将得到填充。2.只查询一个字段,默认情况下,list中封装的是Object对象。3.查询两个或两个以上的字段,默认情况下,list中封装的是Object[],长度与所查询的字段数一致。对于后两种情况,用标签遍历时不太方便,因为无法直接转换成实体类的对象。比较简单的解决方法是:在hql中使用 select new 包名.类名(属性1,属性2……) from 实体类,同时在实体类中添加带参的构造方法,参数的个数和顺序与(属性1,属性2……) 保持一致,这样我们得到的list中存放的依然是实体类的对象,所查询到的属性得到了填充,使用起来更为方便。
hql查询多表部分字段:select new 包名.表1实体类名(表1.属性1,表2.属性2……) from 表1实体类,表2实体类 where 表1.ID=表2.ID(即相关联的字段),同时在要返回的表1实体类中添加表2的属性和带参的构造方法,参数的个数和顺序与(表1.属性1,表2.属性 2……) 保持一致在我的项目中事实证明无效,可能对其他有效,可以一试!!!===========================第三种方法,可以成功,百试不爽!!!==========================不知道是否还有其他方法实现,请高人指点。如果涉及到多张表多字段查询,并且想利用查询出来的字段在界面层构建一个新的实体类,可以使用这种方法;如果查询出来的多字段中,有多个字段的名字都相同(如想查询出A表的id,B表的id,C表的id),可以使用这种方法;秘籍:使用Spring实体注入的方式来做就可以了!比如A表和B表和C表构成一个完整的事件信息,其中C表包含A,B表的关联id(分别为A,B表的主键)。那么你就可以使用C表作为主要实体,将A,B表的实体注入到C表实体中(我是用的注入方式是getter/setter方法)然后你可一使用hql查询出C表实体:select c from C c,B b, A a where c.aid=a.id and c.bid=b.id;(...)查询出来后使用List<C>来获取集合:List<C> llist=.....;遍历clist..for( C cl:clist){ cl.getA().A表实体的各个字段; cl.getB().B表实体的各个字段;你都可以获取出来,哈哈,终于成功了!!!}
Transformers.ALIAS_TO_ENTITY_MAP).list();
//此时,每个Object可以转换成一个Map
Map map = (Map) list.get(i);
map.get("PARENT_ID"); //这里的key 一定是 数据库对应的字段名才行 例如:[java]view plaincopy<span style="font-family:Microsoft YaHei;font-size:13px;">// 查询出数据
String hql = "select a.id as emergencyBasExeId,a.LEVEL as level,a.SEND_TIME as sender_time,a.NAME as name,a.CONTENT as content " +
",a.PROCESS_ID as processId,m.STATES as states,m.id as id,m.emergencyInfoSecondMgr.id as emergencySencondMgrId " +
" from EmergencyInfoFirstExe a, EventManage m where a.deleteFlag = 0 and a.id=m.emergencyInfoFirstExe.id ";
// 查询出数据list
List exeList = eventManageDao.notifyHqlPage(hql, pageNumber * pageSize, pageSize);
// 返回所需要的数据List
List<EventInfoView> reList = new ArrayList<EventInfoView>();
//map.get("PARENT_ID"); //这里的key 一定是 数据库对应的字段名才行
//对返回List的数据封装
for(Object exe : exeList){
EventInfoView event = new EventInfoView();
//此时,每个Object可以转换成一个Map
Map map=(Map)exe;
//然后可以使用map.get("属性名");即可取值
event.setId(map.get("id").toString());
event.setContent(map.get("content").toString());
event.setEmergencyBasExeId(map.get("emergencyBasExeId").toString());
event.setEmergencySencondMgrId(map.get("emergencySencondMgrId").toString());
event.setEmergencyTitle(map.get("emergencyTitle").toString());
event.setLevel(map.get("level").toString());
event.setName(map.get("name").toString());
event.setProcessId(map.get("processId").toString());
event.setProcessName(map.get("processName").toString());
event.setSender_time(map.get("sender_time").toString());
event.setStates(map.get("states").toString());
//....
reList.add(event);
}
</span>
上面的方法经过验证无效!!!==============================第二种方法==============================hql查询单表部分字段:在hibernate中,用hql语句查询实体类,采用list方法的返回结果为一个List,该List中封装的对象分为以下三种情况:1.查询全部字段的情况下,如"from 实体类",list中封装的对象为实体类本身,各属性都将得到填充。2.只查询一个字段,默认情况下,list中封装的是Object对象。3.查询两个或两个以上的字段,默认情况下,list中封装的是Object[],长度与所查询的字段数一致。对于后两种情况,用标签遍历时不太方便,因为无法直接转换成实体类的对象。比较简单的解决方法是:在hql中使用 select new 包名.类名(属性1,属性2……) from 实体类,同时在实体类中添加带参的构造方法,参数的个数和顺序与(属性1,属性2……) 保持一致,这样我们得到的list中存放的依然是实体类的对象,所查询到的属性得到了填充,使用起来更为方便。
hql查询多表部分字段:select new 包名.表1实体类名(表1.属性1,表2.属性2……) from 表1实体类,表2实体类 where 表1.ID=表2.ID(即相关联的字段),同时在要返回的表1实体类中添加表2的属性和带参的构造方法,参数的个数和顺序与(表1.属性1,表2.属性 2……) 保持一致在我的项目中事实证明无效,可能对其他有效,可以一试!!!===========================第三种方法,可以成功,百试不爽!!!==========================不知道是否还有其他方法实现,请高人指点。如果涉及到多张表多字段查询,并且想利用查询出来的字段在界面层构建一个新的实体类,可以使用这种方法;如果查询出来的多字段中,有多个字段的名字都相同(如想查询出A表的id,B表的id,C表的id),可以使用这种方法;秘籍:使用Spring实体注入的方式来做就可以了!比如A表和B表和C表构成一个完整的事件信息,其中C表包含A,B表的关联id(分别为A,B表的主键)。那么你就可以使用C表作为主要实体,将A,B表的实体注入到C表实体中(我是用的注入方式是getter/setter方法)然后你可一使用hql查询出C表实体:select c from C c,B b, A a where c.aid=a.id and c.bid=b.id;(...)查询出来后使用List<C>来获取集合:List<C> llist=.....;遍历clist..for( C cl:clist){ cl.getA().A表实体的各个字段; cl.getB().B表实体的各个字段;你都可以获取出来,哈哈,终于成功了!!!}
相关文章推荐
- Java中使用hql,sql查询--多表查询后的新实体构建方法详解
- Java中使用hql,sql查询--多表查询后的新实体构建方法详解
- Java中使用hql,sql查询--多表查询后的新实体构建方法详解
- Java中使用hql,sql查询返回的list<Object> 转成需要的实体对象--方法讲解!
- 【JavaWeb-21】多对多关系、类和关联级别的加载策略、HQL查询详解、Hibernate连接池配置、Hibernate里悲观锁乐观锁使用
- 使用SQL查询语句映射到对象实体的方法汇总
- java执行SQL语句实现查询的通用方法详解
- Hibernate使用sql语句查询,返回实体类型的方法及注意事项
- java log4j详解及其使用方法
- hibernate使用原生sql查询Hibernate原生SQL多表查询字段名重复问题以及解决方法
- Java之数组查询Arrays类的binarySearch()方法详解
- java 注解的几大作用及使用方法详解
- java 反射机制构建JDBC查询方法
- SparkSQL UDF使用方法与原理详解
- 详解Java中的do...while循环语句的使用方法
- Hibernate(HQL/SQL)查询结果(Object)转换为实体类型
- 使用Java的Graphics类进行绘图的方法详解
- 从java文件和CS文件里查询方法使用次数工具
- 《Entity Framework 6 Recipes》中文翻译系列 (26) ------ 第五章 加载实体和导航属性之延缓加载关联实体和在别的LINQ查询操作中使用Include()方法
- Java 注解的几大作用及使用方法详解(完)