hibernate使用原生sql帮助类

      Hibernate出现很久了,的确用起来很省事,只需要处理对象就可以操作数据库。但是凡事都有两面性,它的省事带来的一个问题就是确实不太灵活。有时候一句SQL搞定的事情,用HQL写看后台日志的话会发现它会把简单的事情复杂化,大大降低了效率。

 

      Hibernate支持SQL情况如下:session.createSQLQuery("select * from xxx where .....").addEntity(A.class)。这个A类必须是对应库表映射的,否则数据是无法回填的。如果查询结果集为多表的组合,那么你的SQL要写成select a.*,b.*c.*... from a,b,c,...where ...然后分别对这几个表对应的实体类进行addEntity后来忍无可忍,直接写SQL接收返回的List<Object[]>(query.list()),然后遍历数组,从list中取Object数组,再从数组中取值手动添加到实体类,虽然这个地方写的比较繁琐,但是减少了与数据库的交互,也略去了不需要的数据。

 

      对于用惯原生sql的我来说,更爱这种写原生sql的方法。当然比较简单的查询用HQL是必然的,要灵活运用。为了让自己免去重复遍历list,遍历数组的重复劳动,写了下面帮助方法,如果有跟我一样的兄台,也可以一用。

private static final String method_key = "set";	
	public static synchronized void fixDataToClz(Object clz,String[] orderArray,Object[] dataArray){
		Method[] methods = null;
		try{
			Class<?> c = clz.getClass();
			methods = c.getDeclaredMethods();
			for(int i=0;i<orderArray.length;i++){
				String key = orderArray[i];
				for(Method method:methods){
					String method_name = method.getName();
					if(method_name.startsWith(method_key)&&(method_name.substring(method_key.length()).equalsIgnoreCase(key))){
						Field temp_field = c.getDeclaredField(key);
						Method callMethod = c.getDeclaredMethod(method_name, temp_field.getType());
						Object obj = dataArray[i];
						callMethod.invoke(clz, obj);
						break;
					}
				}
			}				
		}catch(Exception e){
			System.out.println(e.getMessage());
		}
	}

PS:由于我的方法是写在帮助类中的static方法,因此加了锁,怕并发。也可以单另写在类中就不需要static synchronized 了。

 

使用方法:

1.创建一个自定义实体类,把自己想要查询的数据都写在类的属性值中,并增加getters&setters(下面例子中是Test类)。

 

2.写原生sql查询,根据自己写的sql语句来创建一个字符串数组,内容是sql中查询的内容。

例如:

select a.id,b.name from a b where a.id = b.fk_id;

那这个数组String[] order_array = {"id","name"};

注意,这个数组长度一定是跟查询元素的个数是一致的,但是内容要跟我们创建的自定义实体类的属性值一致。表a的id如果对应 自定义实体类的属性是 a_id,那么我们的数组中写的就是a_id而非id

 

3.List<Object[]> list = query.list();

List<Test> testList = new ArrayList<Test>();

if(!ArrayUtils.isEmpty(list)){

   for(Object[] obj_array:list){

           //new 一个需要回填值的实体类,不管是否在数据库有否映射表

           Test test = new Test();

            /**调用帮助方法,参数说明:自定义实体类对象(Test类),根据sql语句创建的数组(order_array注意数组元素顺序与sql查询column顺序一致),数据数组(obj_array由query.list()返回list中取得)。**/

            fixDataToClz(test ,order_array,obj_array);

            //将已经被填入值的实体类加入到list中去。

           testList.add(test);

          }

}

 

 

 

hibernate 执行原生sql的几种方式 NULL 博文链接:https://ynp.iteye.com/blog/2007053 立即下载

相关推荐

手把手教你用Cursor + 自定义MCP工具链,让AI帮你搞定App逆向(附adb-mcp/frida-mcp源码)

本文详细介绍了如何利用Cursor IDE与自定义MCP工具链构建AI驱动的App逆向工作流,涵盖adb-mcp和frida-mcp的源码实现与实战应用。通过自然语言指令,AI可自动化完成设备控制、动态Hook和数据分析,显著提升移动安全测试效率。适合安全研究人员和开发者快速掌握智能逆向技术。

weixin_33737134的博客 1303

Hibernate中使用原生的sql语句进行查询操作

1.  在Hibernate中使用原生的sql语句进行查询操作 2.  使用HQL查询的一般步骤 2.1 一般的用法 addEntity(Student.class)将查询结果转换为实体类 String sql = ""; session.createSQLQuery(sql).addEntity(Student.class).list(); 2.2 使用原生SQL语句,查询

Learning 1万+

DeepSeek-OCR又更新:一起看下OCR1和OCR2

DeepSeek-AI 最近又又开源了,这次是DeepSeek-OCR2,结合之前发布的DeepSeek-OCR ,可以发现DeepSeek走出了一条不同于主流 OCR 方案的技术路线。第一代模型探索了**“视觉作为文本压缩介质”的可行性,打破了传统的序列长度限制;第二代模型则通过“Visual Causal Flow(视觉因果流)”**架构,将因果推理引入视觉编码器,解决了复杂排版下的阅读顺序难题。本文将从架构设计、逻辑结构、训练范式及工程实现四个维度,深度剖析这两代模型的异同与创新。

kakaZhui的博客 626

Hibernate执行原生SQL

1、查询指定字段 public List&lt;Object[]&gt; getUseList( Integer index, Integer offset, String state, String search ){ String sqlSelect = "select user_id, user_name "; String sq...

weixin_34007291的博客 267

NX二次开发 内部函数鼠标动态位置获取

内部函数鼠标动态位置获取

qq285503851的博客 3337

ThingsBoard集群部署之k8s

今天终于有时间去搞这个啦,拖了很久了,一直没时间,因为我本地没有那么多机器资源,开虚拟机不够,如果租用阿里云服务器,需要有充值的时间,因为这个费用是按小时付费,需要有连贯的时间来搞才行,今天恰好有时间,就开始搞了,弄成功搞出来了,特地写博客记录下来。

AldrichEugene 1176

hibernate 执行原生sql,select返回string,long

http://heisetoufa.iteye.com/blog/1564095 1.执行sql,返回一个结果集,适用查询一个字段并返回一条记录 Java代码   public Long findSeqTbTest() {        String sql = "select SEQ_TB_TEST.nextval from dual";        SQLQuer

swazer_z 4465

Python数据分析师必备:OpenClaw开启Pandas清洗脚本自动生成新时代

本文介绍了OpenClaw这一AI智能体框架如何帮助Python数据分析师高效完成数据清洗工作。OpenClaw通过自然语言交互理解用户需求,自动生成Pandas清洗脚本,显著提升了数据清洗效率,降低了技术门槛。文章详细阐述了OpenClaw的工作原理、实战应用步骤及其在电商、金融、医疗等行业中的成功案例。相比传统手动编写脚本方式,OpenClaw能快速生成规范准确的清洗代码,使数据分析师能更专注于业务洞察。该工具为数据驱动决策提供了可靠支持,是数据分析领域的重要创新。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 231

Hibernate的八大类HQL查询集合

Hibernate的八大类HQL查询集合: 一:属性查询(SimplePropertyQuery) 1,单一属性查询 *返回结果集属性列表,元素类型和实体类中相应的属性一致 2, 多个属性查询, * 返回集合中的元素是object数组, * 其中数组元素的类型和对应属性在实体类中的类型一致 代码: for(Iterator iterator=list.itera

a568690944的专栏 1437

【skill】漫剧 AI 视频创作的知识库 + API 调用手册

方案适用场景在对话中使用,自动触发注入到任何 LLM(Cursor/Windsurf/Claude API)Python 模块集成到自动化管线/批量生成GitHub 又限速了,不过前几轮搜到的已经够用了。根据搜索结果,结合已分析过的项目,给你整理完整对比 🐮。

突围 1002

基于截图详解:SAP GUI for Java 如何设置登录链接,以及 conn= 连接字符串该怎么写

摘要:SAP GUI for Java 的连接属性配置关键是在"高级"页签的"conn="后填写连接字符串。连接字符串格式取决于网络拓扑:直连应用服务器使用"/H/主机/S/端口";通过消息服务器负载均衡使用"/M/消息服务器/S/端口/G/组名";经SAProuter访问则需添加路由器前缀。配置时需注意专家模式会覆盖其他页签设置,且连接字符串还支持附加参数如客户端、语言和默认事务码。具体填写内容应根据Basis团队提供的系统信

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 252

Hibernate使用原生SQL查询

Hibernate使用原生SQL查询   Hibernate提供了原生的SQL语句的查询,通过createSQLQuery(String)和createNativeQuery(String),createSQLQuery(String)是Hibernate5.x之前的版本的,在Hibernate5.x和之后,都采用的是createNativeQuery(String),使用原生SQL虽然麻烦,但是...

莫负时光 5365

强化学习实战——OpenAI Gym环境配置+实战演示(win10)

遇到问题:无法安装pickle5原因是:python3.8与该包不兼容,必须降python3.7的版本。

LZL2020LZL的博客 4900

Hibernate 使用原生 Native SQL

Hibernate 是 DBA 最讨厌的框架之一, 在于 HQL 的滥用, 导致后期调优极度困难, 复杂的查询还是需要使用原生 SQL 来进行, 那么熟悉原生 SQL 调用就至关重要...

wenniuwuren 5011

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Hibernate使用原生SQL语句

以下是本人对Hibernate使用原生SQL语句的理解: 在项目开发当中使用Hibernate提供的HQL有时候不能满足需求,尤其是多表查询或者是多表中没创建主外键关联关系,我也试过平常的连接 比如说a表和b表,a、b表没建立主外键关系。a、b表对应的实体为A、B               (SQLServer语法) create table a ( aId int

沉底的石头 2063

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Hibernate使用原生SQL语句(left join左连接查询)

Hibernate使用原生SQL语句 以下是本人对Hibernate使用原生SQL语句的理解: 在项目开发当中使用Hibernate提供的HQL有时候不能满足需求,尤其是多表查询或者是多表中没创建主外键关联关系,我也试过平常的连接 比如说a表和b表,a、b表没建立主外键关系。a、b表对应的实体为A、B(SQLServer语法) create table a ...

龚小帅的博客 2993

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Hibernate中使用原生sql语句

hibernate对原生SQL查询的支持和控制是通过SQLQuery接口实现的,这种方式弥补了HQL、Criterion查询的不足,在操作和使用上往往更加的自由和灵活,如果使用得当,数据库操作的效率还会得到不同程度的提升。 Hibernate对原生 SQL查询的支持和控制是通过SQLQuery接口实现的。通过Session接口,我们能够很方便的创建一个SQLQuery(SQLQuery是一个 接...

u010878154的博客 535

Hibernate SQLQuery执行原生SQL

一、简介 Hibernate对原生SQL查询的支持和控制是通过SQLQuery接口实现的。通过Session接口,我们能够很方便的创建一个SQLQuery(SQLQuery是一个接口,在Hibernate4.2.2之前,默认返回的是SQLQuery的实现类——SQLQueryImpl对象,在下文中出现的SQLQuery如非注明,都是指该子类)对象来进行原生SQL查询:1、查询的那个对象的简单查询事

houtingpeng的博客 1477

使用Hibernate SQLQuery执行原生SQL

Hibernate对原生SQL查询的支持和控制是通过SQLQuery接口实现的。通过Session接口,我们能够很方便的创建一个SQLQuery(SQLQuery是一个接口,在Hibernate4.2.2之前,默认返回的是SQLQuery的实现类——SQLQueryImpl对象,在下文中出现的SQLQuery如非注明,都是指该子类)对象来进行原生SQL查询: session.createSQ

qq_23476319的博客 1145

Hibernate(一)HQL查询、原生sql查询

Hibernate中支持三种查询方式:HQL(Hibernate Query Language),原生sql查询,Criteria查询。HQL是一种面向对象的查询语言,其中没有表和字段的概念,只有类、对象、属性的概念;原生sql查询就是我们程序员手动的写sql语句并执行;Criteria查询又称为对象查询,采用真正的面向对象的方式进行查询,原生sql查询和Criteria查询将在后续篇章中进行讲解

代码与酒 6437

HIBERNATE对原生SQL的处理

对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口。最简单的情况下,我们可以采用以下形式: List cats = sess.createSQLQuery("select * from cats") .addEntity(Cat.class) .list(); 这个查询指定了: SQL查询字符串 查

沉底的石头 1821

Hibernate原生SQL查询多表关联,SQL语句要注意的问题

Hibernate原生SQL查询多表关联,SQL语句要注意的问题@for&ever 2009-9-4 系统环境:MySQL5.1Hibernate3.3 有如下的假定:实体类 Question 和 Answer分别对应数据表 question 和answer。并且表 question 和answer 的字段大部分都一样,字段数目也一样。 执行如下的操作:

for ever的log——永远的足迹 1万+

Hibernate实战——原生SQL查询

一配置文件 <?xml version="1.0" encoding="GBK"?> <!-- 指定Hibernate配置文件的DTD信息 --> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http:...

实践求真知 786

在hibernate中,如何把原生sql查询出来的结果映射到实体bean

大家都知道hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装。 个人觉得,hibernate自带的hql语句却不见得很好用。 现实工作中,有很多场景是用到原生sql进行查询的,比如oracle的递归、复杂语句查询等。或许hql也能进行递归、复杂语句的查询,但像我这种用惯ibatis的,很是不爽hql。 简单举个例子说一下,hq

宇强的一亩三分地 6380
上一篇: maven下POM文件配置打包时引用本地jar包
下一篇: 解决IE下 不识别json格式返回结果的问题
vortex331
博客等级 码龄16年 0粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值