java多表查询实体接收_hibernate多表查询封装实体

本文介绍了在Hibernate中如何实现多表联合查询,通过HQL查询与SQL查询的对比,展示了在大数据量场景下如何避免建立关系。提供了一段示例代码,展示如何根据查询结果将数据封装到自定义的实体类中。
摘要由CSDN通过智能技术生成

以前用sql实现联合查询 是非常简单的事,只需要写sql语句就可以,第一次遇到hibernate要实现多表联合查询的时候还楞了一下。最后看了下资料,才恍然大悟,hibernate实现多表联合查询跟SQL没多大差别。

hibernate很多实现都是靠喜欢配关系,但是如果两张表,数据量都非常大的时候,并不合适配关系。

例如:student表和score表需要做联合查询。

1)sql: select s.id,s.name,sc.score from student as s,score as sc where s.id = sc.userId;

(字段都是用的数据库中字段名称)

2)HQL: select s.id,s.name,sc.score from Student as s,Score as sc where s.id = sc.userId;

(上面字段都是 javabean的属性)

如果我们按1)查询的话,必须调用 session.createSQLQuery();方法

如果按2)查询,还是调用 session.createQuery();

只是要注意,平时我们查询的时候,例如:“from Student ”查询的结果集 封装的全都是student对象,但是2)执行的结果集里面不是对象,而是一系列数组。需要转换成需要的样式。

下面 是查询的一段代码:

Session session = getHibernateTemplate().getSessionFactory()

.getCurrentSession();

StringBuffer sb = new StringBuffer(" select user.username,user.truename,user.sex,user.idnum,user.level,s.sumScore from Score as s,Examuser as user where s.id.userId = user.id ");

if(score != null){

if(score.getExamId()!=null && !"".equals(score.getExamId())

&& !"null".equals(score.getExamId())){

sb.append(" and s.examId =:examId ");

}

if(score.getExamPlace()!=null && !"".equals(score.getExamPlace())

&& !"null".equals(score.getExamPlace())){

sb.append(" and s.examPlace =:examPlace ");

}

if(score.getUsername()!=null && !"".equals(score.getUsername())

&& !"null".equals(score.getUsername())){

sb.append(" and s.username like:username ");

}

}

sb.append(" order by s.sumScore desc ");

Query q = session.createQuery(sb.toString());

if(score != null){

if(score.getExamId()!=null && !"".equals(score.getExamId())

&& !"null".equals(score.getExamId())){

q.setParameter("examId",score.getExamId());

}

if(score.getExamPlace()!=null && !"".equals(score.getExamPlace())

&& !"null".equals(score.getExamPlace())){

q.setParameter("examPlace",score.getExamPlace());

}

if(score.getUsername()!=null && !"".equals(score.getUsername())

&& !"null".equals(score.getUsername())){

q.setParameter("username","%"+score.getUsername()+"%");

}

}

List list = q.list();

需要将查询的结果集 进行一下转换:

List stuList = scoreService.findAllScore(queryScore, null); // 返回的结果集

if(stuList != null && stuList.size()>0){

list = new LinkedList();

StudentScore st;

for(int i = 0; i < stuList.size();i++){

st = new StudentScore();

Object[] object = (Object[])stuList.get(i);// 每行记录不在是一个对象 而是一个数组     String userId =  (String)object[0];

String username =  (String)object[1];

String truename =  (String)object[2];

String sex =  (String)object[3];

String idnum =  (String)object[4];

String level =  (String)object[5];

Double sumScore =  Double.parseDouble(String.valueOf(object[6]));

String paperId =  (String)object[7];

// 重新封装在一个javabean里面

st.setUserId(userId);

st.setUsername(username);

st.setTruename(truename);

st.setIdnum(idnum);

st.setLevel(DictSwitch.getValue("DICT_LEVEL",level));

st.setSex(DictSwitch.getValue("DICT_SEX",sex));

st.setPaperId(paperId);

st.setSumScore(sumScore);

st.setExamplace(DictSwitch.getValue("DICT_EXAMSTATION",examplace));

list.add(st); // 最终封装在list中 传到前台。

}

Hibernate应用SQL查询返回实体类型

Hibernate应用SQL查询返回实体类型 Hibernate使用SQL查询返回实体类型 以前,使用SQL查询,结果放在 RS 结果集中,还要去转换影射到Java类中.Hibernate中,可以自动 ...

hibernate多表查询,结果封装在自己定义的一个实体类当中(在自己定义的类中增加构造函数)

hibernate的hql查询直接返回java对象时出现问题3 向大家请教一个问题,现在有三张表,表之间没有关联,我需要将三张表里面的所有东西查询出来存储到一个新的对象中,该如何实现,使用hibern ...

Java面试题:Hibernate的二级缓存与Hibernate多表查询

我们来看两个有关Java框架之Hibernate的面试题,这是关于Hibernate的常考知识点. 1.请介绍一下Hibernate的二级缓存 解题按照以下思路来回答: (1)首先说清楚什么是缓存: ...

Hibernate多表查询、查询优化策略(四)

多表HQL private static void innerJoin(){ //sql内连接 隐式内连接 select * from A,B where b.aid = a.id // 显示内连接 ...

hibernate多表查询

一对多进行查询(用懒加载的模式) 查找区域所对应的街道: Dao: public Qu selQu(String dno){ Session session=HibernateSessionFacto ...

hibernate 多表查询

Hibernate主要支持两种查询方式:HQL查询和Criteria查询.前者应用较为广发,后者也只是调用封装好的接口. 现在有一个问题,就是实现多表连接查询,且查询结果集不与任何一个实体类对应,怎么 ...

Hibernate多表查询连接操作

SQL多表操作分类; 1.交叉连接:select*from t_customer cross Join t_order; 2.显示内连接: select*from t_customer c inner ...

Hibernate 多表查询 - Criteria添加子字段查询条件 - 出错问题解决

Criteria 查询条件如果是子对象中的非主键字段会报 could not resolve property private Criteria getCriteria(Favorite favori ...

【Hibernate 多表查询】

HibernateManyTable public class HibernateManyTable { //演示hql左连接查询 @Test public void testSelect12() { ...

随机推荐

WampServer下如何实现多域名配置(虚拟域名配置)

之前在学习跨域的时候,我写过一篇叫做WampServer下使用多端口访问的文章,默认的 localhost 采用的是 80 端口,能使用多端口访问的核心是得新建一个端口,也就是新建一个 http 服务 ...

python logging模块 basicConfig配置文件

logging.basicConfig(level=log_level, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s ...

find查找指定类型文件并删除

问题描述:                      查找当前目录下指定类型的文件              问题解决:                     (1)find命令   ...

web&period;config 拆分

在 web.config 加入上面  然后创建 ...

第八届河南省赛B&period;最大岛屿(dfs)

B.最大岛屿 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 30  Solved: 18 [Submit][Status][Web Board] De ...

Go 只读&sol;只写channel

Go中channel可以是只读.只写.同时可读写的. //定义只读的channel read_only := make (

C&num;单例模式的几种实现方式

一.多线程不安全方式实现 public sealed class SingleInstance { private static SingleInstance instance; private S ...

IdentityServer4:IdentityServer4&plus;API&plus;Client&plus;User实践OAuth2&period;0密码模式(2)

一.密码模式实操 仍然使用第一节的代码:做如下改动: 1.授权服务端 前面我们使用项目:Practice.IdentityServer作为授权服务器 修改项目的Config.cs类: 添加测试用户,并 ...

classpath分析

1. 什么是classpath? classpath相当于Java执行环境,它指定了一些常用的包或jar的位置,方便我们对项目文件的使用,而不必重复多次写所需要文件的位置.    在classpath ...

TryParse用法

int.Parse()是一种类型转换:表示将数字内容的字符串转为int类型. 如果字符串为空,则抛出ArgumentNullException异常: 如果字符串内容不是数字,则抛出FormatExce ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值