Hibernate使用原生SQL语句进行无关联多表查询
背景:有两个表: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语句进行无关联多表查询的更多相关文章
- java:Hibernate框架3(使用Myeclipse逆向工程生成实体和配置信息,hql语句各种查询(使用hibernate执行原生SQL语句,占位符和命名参数,封装Vo查询多个属性,聚合函数,链接查询,命名查询),Criteria)
1.使用Myeclipse逆向工程生成实体和配置信息: 步骤1:配置MyEclipse Database Explorer: 步骤2:为项目添加hibernate的依赖: 此处打开后,点击next进入 ...
- Hibernate使用原生sql语句
异常类型1:could not extract resulted --->表名字和类名不一致 异常类型2:could not execute query---->可能是sql语句错: 异常 ...
- 关于No Dialect mapping for JDBC type :-9 hibernate执行原生sql语句问题
转自博客http://blog.csdn.net/xd195666916/article/details/5419316,同时感谢博主 今天做了个用hibernate直接执行原生sql的查询,报错No ...
- Mysql常用sql语句(14)- 多表查询
测试必备的Mysql常用sql语句,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1683347.html 前言 ...
- SQL语句(四)联表查询
目录 一.关联查询的分类 按年代分 按功能分 二.sql92语法的连接 语法 1. 简单应用 2. 为表起别名 3. 加入筛选 4. 加入分组 5. 三表连接 6. 非等值连接 7. 自连接 三.sq ...
- SQL语句(十三)多表查询
多表查询 1. 笛卡尔乘积 简单格式 SELECT * 或字段列表 FROM 数据表列表 实例 --1. 笛卡尔乘积 (五条件的连接--很多条件无意义) Select * from Student, ...
- 在Hibernate中使用原生SQL语句
使用原生SQL查询必须注意:程序必须选出所有的数据列才可被转换成持久化实体.假设实体在映射时有一个<many-to-one../>的关联指向另外一个实体,则SQL查询中必须返回该<m ...
- hibernate使用原生SQL查询返回结果集的处理
今天没事的时候,看到公司框架里有一个用原生SQL写的函数,说实在以前自己也干过这事,但好久都没有用,都忘得差不多了,现在基本都是用的hql语句来查询结果.hibernate中使用createSQLQu ...
- Hibernate SQLQuery 原生SQL 查询及返回结果集处理-1
第一篇:官方文档的处理方法,摘自官方 在迁移原先用JDBC/SQL实现的系统,难免需要采用hibernat native sql支持. 1.使用SQLQuery hibernate对原生SQL查询执行 ...
随机推荐
- MySQL数据库高级五:主从复制
主机只能一台 从机去复制 单表500万上限
- 2021 DevOpsDays 东京站完美收官 | CODING 专家受邀分享最新技术资讯
DevOpsDays 是一个全球知名的系列技术会议品牌,内容涵盖了软件开发.自动化.测试.安全.组织文化以及 IT 运营的社区会议等.DevOpsDays 由 DevOps 之父 Patrick De ...
- Java集合原理分析和知识点大杂烩(多图初学者必备!!)
一.数据结构 数据结构就是计算机存储.组织数据的方式. 在计算机科学中,算法的时间复杂度是一个函数,它定性描述了该算法的运行时间,常用O符号来表述. 时间复杂度是同一问题可用不同算法解决, ...
- ES系列(三):网络通信模块解析
ES是一个分布式搜索引擎,其除了用户提供必要的通信服务外,集群间也必须保持紧密的通信联系,才能在必要的时候给出正确的结果.其则必然涉及到各种繁多且要求高的通信场景,那么如何实现高性能的通信,则是其必须 ...
- 1. Robot Framework入门
RF定义: 通用型的 自动测试框架, 绝大部分的软件的的自动化系统都可以采用它. 特点: 测试数据文件(Test Data)对应一个个的测试用例.测试数据文件里面使用的功能小模块叫关键字,由测试库(T ...
- POJ3122贪心或者二分(分蛋糕)
题意: m+1个人来分n个蛋糕,每个人分到的蛋糕数必须一样而且还必须是同一个蛋糕上的,问每个人最多分多少蛋糕? 思路: 能想到的方法有两种,一个是直接贪心,另一个就是二分,这个 ...
- UVA10905孩子们的游戏
题意: 给你n个数字,让你用这n个数组组成一个最大的数字并输出来. 思路: 这个题目看完第一反应就是直接按照字符串排序,然后轻轻松松写完,交上去直接wa了,为什么会wa呢?感觉 ...
- c#-全局键盘钩子
using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using ...
- Win64 驱动内核编程-13.回调监控模块加载
回调监控模块加载 模块加载包括用户层模块(.DLL)和内核模块(.SYS)的加载.传统方法要监控这两者加在必须 HOOK 好几个函数,比如 NtCreateSection 和 NtLoadDriver ...
- c# 通过 p/invoke 使用 c的加密程序 参数传递问题
最近项目中使用需要上位机和下位机通过rs232通信,涉及到通讯加密问题, 硬件那边主要是pcb layout的,于是我就把加密的活拦了过来,锻炼锻炼 首先说明问题: 在c中,加密解密都测试通过,然后在 ...