背景:有两个表:CpCg与CpGg需要进行多表查询

因为CpGg表设计到与另外的表也有联系,因此师兄没有关联此两个表,只是用字段进行逻辑关联,CpGg表的cp字段与CpCg表的id字段逻辑关联

首先确保hibernate配置文件配置完成,配置文件如下:(一些与本人项目相关的关键字段已隐去)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 指定连接数据库所用的驱动 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 指定连接数据库的url,其中hibernate是本应用连接的数据库名 -->
<property name="connection.url">jdbc:mysql://localhost/efoer</property>
<!-- 指定连接数据库的用户名 -->
<property name="connection.username">root</property>
<!-- 指定连接数据库的密码 -->
<property name="connection.password">123</property>
<!-- 指定连接池里最大连接数 -->
<property name="hibernate.c3p0.max_size">20</property>
<!-- 指定连接池里最小连接数 -->
<property name="hibernate.c3p0.min_size">1</property>
<!-- 指定连接池里连接的超时时长 -->
<property name="hibernate.c3p0.timeout">5000</property>
<!-- 指定连接池里最大缓存多少个Statement对象 -->
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.validate">true</property>
<!-- 指定数据库方言 -->
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- 根据需要自动创建数据库 -->
<property name="hbm2ddl.auto">update</property>
<!-- 显示Hibernate持久化操作所生成的SQL -->
<property name="show_sql">true</property>
<!-- 将SQL脚本进行格式化后再输出 -->
<property name="hibernate.format_sql">true</property>
<!-- 罗列所有持久化类的类名 -->
<mapping class="com.efoer.model.CgLb"/> <!--这里是我所有的数据实体名,不一一罗列了--> </session-factory>
</hibernate-configuration>

配置完成后,新建一个包,命名为Util,在此包下创建一个类:HibernateUtil.java。此类代码如下:

package util;

import org.hibernate.*;
import org.hibernate.cfg.*;
import org.hibernate.service.*;
import org.hibernate.boot.registry.*; public class HibernateUtil
{
public static final SessionFactory sessionFactory; static
{
try
{ Configuration cfg = new Configuration()
.configure(); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(cfg.getProperties()).build();
sessionFactory = cfg.buildSessionFactory(serviceRegistry);
}
catch (Throwable ex)
{
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
} public static final ThreadLocal<Session> session
= new ThreadLocal<Session>(); public static Session currentSession()
throws HibernateException
{
Session s = session.get(); if (s == null)
{
s = sessionFactory.openSession(); session.set(s);
}
return s;
} public static void closeSession()
throws HibernateException
{
Session s = session.get();
if (s != null)
s.close();
session.set(null);
}
}

完成以上工作以后开始在对应的controller里面写sql语句

    @RequestMapping(value="/page",method=RequestMethod.GET)
public String getRole( Model model){ //打开Session和事务
Session session=util.HibernateUtil.currentSession();
Transaction tx=session.beginTransaction();
String sqlString="select s.id,s.pp,s.cd,s.mc,s.lb,s.sj,s.zt,s.jc,e.id,e.cp,e.gg,e.hh,e.tm,e.cz,e.bz,e.dpcc,e.bzcc,e.sl,e.sj,e.cj,e.zt "
+"from cp_cg s, cp_gg e "
+"where s.id=e.cp "
+"and s.zt=2";
List list=session.createSQLQuery(sqlString)
//指定将从S表查询得到的记录行转为CpCg实体
.addEntity("s",CpCg.class)
//指定将从e表查询得到的记录行转为CpGg实体
.addEntity("e", CpGg.class)
.list();
//提交事务,关闭Session
tx.commit();
util.HibernateUtil.closeSession();
//因为数据已经全部被选出,故程序可以遍历列表中的数据 //在控制台输出字段,为了方便自己查看查询结果
for(Object ele:list){
Object[] objs = (Object[])ele;
CpCg s=(CpCg)objs[0];
CpGg e=(CpGg)objs[1];
System.out.println(s.getCd()+s.getMc()+s.getPp()+"\t"
+e.getHh()+e.getTm()+e.getSl());
model.addAttribute("cd", s.getCd()); }
//为了把数据传给前台
model.addAttribute("list", list);
return "/page/pm/index";
}

个人理解:这里关联的两个表查询的,并且查询完成后将记录行转为了两个对应的实体,因此查询出来的list里的每条记录相当于由两个实体对象拼凑而成,list[0]存放的CpCg,list[1]存放的CpGg

所以在前台取值出来的时候list[0]取出的是CpCg对象,list[1]取出的是CpGg对象。代码如下:

<c:forEach items="${list}" var="list">
<ul>
<li class="cpjl-1-head-1"><span>${list[0].id}</span></li>
<li class="cpjl-1-head-2"><span>${list[0].pp}</span></li>
<li class="cpjl-1-head-3"><span>${list[0].cd}</span></li>
<li class="cpjl-1-head-4"><span>${list[0].mc}</span></li>
<li class="cpjl-1-head-5"><span>${list[0].jc}</span></li>
<li class="cpjl-1-head-6"><span>${list[1].gg}</span></li>
<li class="cpjl-1-head-7"><span>${list[1].hh}</span></li>
<li class="cpjl-1-head-8"><span>${list[1].tm}</span></li>
<li class="cpjl-1-head-9"><span>${list[1].cz}</span></li>
</ul>
</c:forEach>

但为什么查询出来的list的数据是这么存放的,个人还没想明白。希望有明白的小伙伴看到后一解本人困惑,不胜感激

Hibernate使用原生SQL语句进行无关联多表查询的更多相关文章

  1. java:Hibernate框架3(使用Myeclipse逆向工程生成实体和配置信息,hql语句各种查询(使用hibernate执行原生SQL语句,占位符和命名参数,封装Vo查询多个属性,聚合函数,链接查询,命名查询),Criteria)

    1.使用Myeclipse逆向工程生成实体和配置信息: 步骤1:配置MyEclipse Database Explorer: 步骤2:为项目添加hibernate的依赖: 此处打开后,点击next进入 ...

  2. Hibernate使用原生sql语句

    异常类型1:could not extract resulted --->表名字和类名不一致 异常类型2:could not execute query---->可能是sql语句错: 异常 ...

  3. 关于No Dialect mapping for JDBC type :-9 hibernate执行原生sql语句问题

    转自博客http://blog.csdn.net/xd195666916/article/details/5419316,同时感谢博主 今天做了个用hibernate直接执行原生sql的查询,报错No ...

  4. Mysql常用sql语句(14)- 多表查询

    测试必备的Mysql常用sql语句,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1683347.html 前言 ...

  5. SQL语句(四)联表查询

    目录 一.关联查询的分类 按年代分 按功能分 二.sql92语法的连接 语法 1. 简单应用 2. 为表起别名 3. 加入筛选 4. 加入分组 5. 三表连接 6. 非等值连接 7. 自连接 三.sq ...

  6. SQL语句(十三)多表查询

    多表查询 1. 笛卡尔乘积 简单格式 SELECT * 或字段列表 FROM 数据表列表 实例 --1. 笛卡尔乘积 (五条件的连接--很多条件无意义) Select * from Student, ...

  7. 在Hibernate中使用原生SQL语句

    使用原生SQL查询必须注意:程序必须选出所有的数据列才可被转换成持久化实体.假设实体在映射时有一个<many-to-one../>的关联指向另外一个实体,则SQL查询中必须返回该<m ...

  8. hibernate使用原生SQL查询返回结果集的处理

    今天没事的时候,看到公司框架里有一个用原生SQL写的函数,说实在以前自己也干过这事,但好久都没有用,都忘得差不多了,现在基本都是用的hql语句来查询结果.hibernate中使用createSQLQu ...

  9. Hibernate SQLQuery 原生SQL 查询及返回结果集处理-1

    第一篇:官方文档的处理方法,摘自官方 在迁移原先用JDBC/SQL实现的系统,难免需要采用hibernat native sql支持. 1.使用SQLQuery hibernate对原生SQL查询执行 ...

随机推荐

  1. C语言-字符串函数的实现(一)之strlen

    C语言中的字符串函数有如下这些 获取字符串长度 strlen 长度不受限制的字符串函数 strcpy strcat strcmp 长度受限制的字符串函数 strncpy strncat strncmp ...

  2. HashMap、ConcurrentHashMap 1.7和1.8对比

    本篇内容是学习的记录,可能会有所不足. 一:JDK1.7中的HashMap JDK1.7的hashMap是由数组 + 链表组成 /** 1 << 4,表示1,左移4位,变成10000,即1 ...

  3. JVM小册(1)------jstat和Parallel GC日志

    JVM小册(1)------jstat和Parallel GC日志 一. 背景 在生产环境中,有时候会遇到OOM的情况,抛开Arthas 等比较成熟的工具以外,我们可以使用java 提供的jatat和 ...

  4. 基于FOC伺服电机驱动的Parallel Scara Robot的设计及实现

    上个学期做了一个BLDC的FOC驱动后,我便开始了基于此类电机驱动的机器人项目尝试.之前想做的是串联机械臂,奈何找不到合适的电机并且串联机械臂十分需要减速机,使得项目对于我来说(经济方面)很艰难,恰巧 ...

  5. POJ3322滚箱子游戏(不错)

    题意:       讲的是一个游戏,就是在一个平面上滚动一个1*1*2的长方体的游戏,在本题里面的游戏规则是这样的: (1)      一开始给你箱子的状态,可能是横着也可能是竖着. (2)     ...

  6. 关于终端设备的设备唯一性的那些事之IMEI(转)

    最近和别人聊起来数据上报,一起讨论到imei和MAC地址,然后发现一个问题:知道这两个东西都不唯一,但是不知道为什么---- 回来上各种小网站巴拉巴拉找了一下,终于大概了解了前世今生,这里简单汇总一下 ...

  7. [CTF]猪圈密码

    [CTF]猪圈密码 -------------------- 百度百科 本词条由"科普中国"百科科学词条编写与应用工作项目 审核 . https://baike.baidu.com ...

  8. Ext.MessageBox.alert()弹出对话框详解

    Ext.MessageBox是一个工具类,他继承自Obiect对象,用来生成各种风格的信息提示对话框,Ext.Msg是该类的别名,使用Ext.MessageBox和用Ext.Msg效果是一样的,而后者 ...

  9. Failed opening required

    报错 点击页面右下角的图标,再点击错误可以显示报错.或者在项目中runtime--log也可以查看error [64]think\\__require_file(): Failed opening r ...

  10. PhpStorm 配置本地文件自动上传至服务器

    目的:本地文件夹下的文件实时同步至指定服务器的文件夹,减少代码移植的成本和风险 添加一个SFTP连接 Tools - Deployment - Browse Remote Host 配置连接参数 Co ...