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语句" Hibernate 是一种流行的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在一些情况下,我们需要直接执行原生 SQL 语句,而不是使用 Hibernate 的...
虽然`Criteria API`主要是为了使用Hibernate的ORM功能,但也可以通过`Projections.sqlProjection()`执行原生SQL投影,从而创建自定义的查询。 ```java Criteria criteria = session.createCriteria(User.class); ...
当然,原生SQL查询也有一些需要注意的地方。由于直接操作SQL,所以数据库的兼容性问题需要开发者自己处理。此外,如果查询结果需要映射到多个实体类,或者返回复杂的结果集,那么处理起来可能会比较麻烦,需要手动...
描述中提到"自己封装了原生sql的处理,模仿mybatis使用",这意味着开发者在项目中创建了一个类似MyBatis的简单SQL解析器。MyBatis是一个轻量级的持久层框架,它允许开发者编写原生的SQL语句并将其与Java代码绑定。...
本篇文章将深入探讨Hibernate中的三种主要查询方式:HQL(Hibernate Query Language)、Criteria API以及原生SQL。 一、HQL(Hibernate Query Language) HQL是Hibernate提供的一种面向对象的查询语言,它类似于SQL...
在使用原生SQL时,需要注意的是,你需要自己处理结果的映射和事务管理,这可能比使用HQL(Hibernate查询语言)更加复杂。 总结,Hibernate提供了丰富的函数支持,使得我们在处理数据时更加便捷。同时,子查询功能...
给定代码示例中的`ProductBoxLogDaoImpl`类展示了如何在Hibernate中执行原生SQL查询,并将结果转换为Java对象列表。 ##### 1. 创建SQLQuery对象 ```java SQLQuery query1 = session.createSQLQuery(sql); ``` 这里...
使用本地sql语句查询后,无需再使用Object对查询结果进行强制转换,而是直接将查询结果放到实体Bean里了。 PS: 其实只有一版,这里只所以叫最终版是因为该附件我上传了好几天传不上去,到最后报告说‘资源已经存在...
本文将深入探讨Hibernate如何通过SQLQuery接口执行原生SQL查询,并展示如何处理查询结果。 一、创建SQLQuery对象 在Hibernate中,我们通常通过Session接口的createSQLQuery方法来创建SQLQuery对象,例如: ```...
标题 "Hibernat使用原生的SQL" 涉及的是在Java开发中如何利用Hibernate框架执行自定义的SQL语句。Hibernate是一个流行的...为了进一步学习,建议阅读该文档,进行实际的编码练习,以加深对Hibernate原生SQL使用的理解。
首先,本地SQL查询(Native SQL)是指直接在Hibernate中使用原生的SQL语句进行查询,而不是使用HQL(Hibernate Query Language)。这允许开发者充分利用SQL的功能,比如进行复杂的统计计算或者处理特定数据库的特性...
查询数据的方法有两种实现,一种是基于HQL(Hibernate Query Language),另一种是基于原生SQL。 - 基于HQL的通用查询: HQL是Hibernate提供的面向对象的查询语言,可以方便地操作对象和属性。`select`方法接收一个...
在某些情况下,开发者可能需要使用原生SQL查询来执行特定的数据库操作,这时就可以利用Hibernate的SQLQuery功能。本文将详细讲解如何使用Hibernate的SQLQuery进行本地SQL查询。 首先,创建SQLQuery实例是通过...
Hibernate支持两种类型的查询:原生SQL查询和Hibernate查询语言(HQL)。原生SQL查询允许开发者直接执行SQL语句,而HQL则是面向对象的查询语言,类似于SQL但更接近于Java。 4. 封装SQL查询结果为对象: - `...
本主题将探讨如何在Hibernate分页类和JDBC的SQL分页方法之间实现完美的融合,以提高性能并提供更好的用户体验。 首先,让我们了解一下Hibernate的分页功能。Hibernate提供了一种方便的方式来处理分页查询,通过...
Hibernate使用Java类作为数据库表的映射,这些类被称为实体类。需要使用`@Entity`注解标识,并使用`@Table`注解指定对应的数据库表名。同时,每个实体类的主键通常使用`@Id`注解标记。 4. **Repository接口**: ...
MyBatis 的主要特点是灵活的SQL映射,通过XML或注解方式配置和映射原生信息,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。为了显示查询SQL,MyBatis 提供了日志配置,通常...
总的来说,理解并充分利用Hibernate的缓存机制和原生SQL语句的使用,可以帮助开发者优化Java Web应用的性能,同时保持代码的灵活性和可维护性。在实际开发中,应根据项目需求选择合适的缓存策略,并适时利用原生SQL...
**Hibernate原生通用DAO**是基于Hibernate框架设计的一种简化数据访问操作的方式,它模仿了Spring框架中的`HibernateTemplate`类,旨在提供一个简单易用的DAO(Data Access Object)层,方便开发人员进行数据库操作...
原生SQL查询可能返回单一标量值或混合标量值与实体的结果。例如,查询猫的最大体重: ```java Double max = (Double) sess.createSQLQuery("select max(cat.weight) as maxWeight from cats cat") .addScalar(...