Hibernate提供了對SQL的支援,您可以指定您所要建立的SQL,並將實體類別與資料表格關聯,舉個例子來說,如果您打算使用像以下的SQL語 句:
SELECT * FROM user WHERE age > 20
則您可以如下建立SQL查詢:
// SQL,並指定別名為user
String sql = "select {user.*} from User user where user.age > 20"; Session session = sessionFactory.openSession(); // 建立 SQLQuery SQLQuery sqlQuery = session.createSQLQuery(sql); // 將別名user與實體類User關聯在一起 sqlQuery.addEntity("user", User.class); Iterator iterator = sqlQuery.list().iterator(); while(iterator.hasNext()) { User user = (User) iterator.next(); System.out.println(user.getAge() + "\t" + user.getName()); } session.close();
addEntity()是將實體類別與別名連結在一起的方法,大括號指定要查詢的資料,Hibernate根據所給定的SQL自動生成以下的句子:
select user.id as id0_, user.name as name0_0_, user.age as age0_0_ from User user where user.age > 20
返回的結果則由Hibernate進行封裝為所指定別名關聯之實體類,如此您可以得到使用SQL的彈性,但無需處理繁瑣的ResultSet。
您也可以將SQL語句定義在映射文件中,例如:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="onlyfun.caterpillar.User" table="user">
....
</class>
<sql-query name="onlyfun.caterpillar.QueryUser"> <![CDATA[ select {user.*} from User user where user.age > 20 ]]> <return alias="user" class="onlyfun.caterpillar.User"/> </sql-query>
</hibernate-mapping>
定義的時候,使用<return>標籤指定別名與實體類之關聯,配合映射文件中的定義,您可以如下運行Hibernate:
Session session = sessionFactory.openSession(); Query query = session.getNamedQuery("onlyfun.caterpillar.QueryUser"); Iterator iterator = query.list().iterator(); while(iterator.hasNext()) { User user = (User) iterator.next(); System.out.println(user.getAge() + "\t" + user.getName()); } session.close();
也可以設定查詢參數,例如:
.... <sql-query name="onlyfun.caterpillar.QueryUser"> <![CDATA[ select {user.*} from User user where user.age > :age ]]> <return alias="user" class="onlyfun.caterpillar.User"/> </sql-query> ....
使用Hibernate查詢時如下: Session session = sessionFactory.openSession(); Query query = session.getNamedQuery("onlyfun.caterpillar.QueryUser"); query.setInteger("age", 20);
Iterator iterator = query.list().iterator(); while(iterator.hasNext()) { User user = (User) iterator.next(); System.out.println(user.getAge() + "\t" + user.getName()); } session.close();
Hibernate 3的映射文件中新增了<sql-insert>、<sql-update>與< sql-delete>三個標籤,您 可以在這三個標籤中使用SQL自定義您的INSERT、UPDATE、DELETE,也就是儲存、更新、刪除資料時的行為,例如:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="onlyfun.caterpillar.User" table="user">
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="name" column="name"/>
<property name="age" column="age"/>
<sql-insert> INSERT INTO user (name, age) VALUES (?, ?) </sql-insert> <sql-update> UPDATE user SET name=?, age=?, WHERE id=? </sql-update> <sql-delete> DELETE FROM user WHERE id=? </sql-delete>
</class>
</hibernate-mapping>
? 對應的順序是映射文件中屬性出現的順序,假設您儲存物件:
session = sessionFactory.openSession(); tx = session.beginTransaction(); session.save(user); tx.commit(); session.close();
則執行結果中顯示的SQL語句會是您自定義的語句,而不是由 Hibernate自動生成的語句:
Hibernate: INSERT INTO user (name, age) VALUES (?, ?) |
|
Hibernate使用sql语句查询总结
public class SqlQueryTest {
public static void main (String [] args){ sqlQueryAddScalar(); } static void sqlQueryAddEntity(){
//获取Hibernate Session对象
Session session = HibernateUtil.getSession();
//开始事务
Transaction tx = session.beginTransaction();
//编写SQL语句
String sqlString = "select * from user";
//以SQL语句创建SQLQuery对象
List l = session.createSQLQuery(sqlString)
//将查询ss实体关联的User类
.addEntity("ss",User.class)
//返回全部的记录集
.list();
//遍历结果集
Iterator it = l.iterator();
while (it.hasNext()){
//因为将查询结果与Student类关联,因此返回的是Student集合
User s = (User)it.next();
String a = s.getName(); System.out.println(a);
}
//提交事务
tx.commit();
session.close();
} static void sqlQueryAddScalar(){ //返回Object[]的遍历 Session session=HibernateUtil.getSession(); Transaction transaction=session.beginTransaction(); String sql="select * from user"; SQLQuery s=(SQLQuery) session.createSQLQuery(sql); //.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP) s.addScalar("id",Hibernate.INTEGER); //列名, 数据类型 s.addScalar("name",Hibernate.STRING); List list=s.list(); Object[] objects=(Object[])list.get(0); System.out.println(objects[0]); System.out.println(objects[1]); //用MAP SQLQuery ss=(SQLQuery) session.createSQLQuery(sql).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); ss.addScalar("id",Hibernate.INTEGER); ss.addScalar("name",Hibernate.STRING); List list2=ss.list(); Map map = (Map) list2.get(0); System.out.println(map.get("name")); System.out.println(map.get("id")); //用LIST
SQLQuery s3=(SQLQuery) session.createSQLQuery(sql).setResultTransformer(Transformers.TO_LIST); s3.addScalar("id",Hibernate.INTEGER); s3.addScalar("name",Hibernate.STRING); List list3=s3.list(); List list4=(List)list3.get(0); System.out.println(list4.get(0)); System.out.println(list4.get(1)); //用自定义的bean SQLQuery e=(SQLQuery) session.createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(SqlQueryBean.class)); e.addScalar("id",Hibernate.INTEGER); e.addScalar("name",Hibernate.STRING); List r=e.list(); SqlQueryBean sqb=(SqlQueryBean)r.get(0); System.out.println(sqb.getId()); System.out.println(sqb.getName()); }
}
|
相关推荐
"hibernate执行原生sql语句" Hibernate 是一种流行的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在一些情况下,我们需要直接执行原生 SQL 语句,而不是使用 Hibernate 的...
- **性能优化**:有时候为了优化查询性能,需要对底层的SQL语句进行精确控制。 - **特定功能支持**:某些数据库特有的功能只能通过原生SQL实现。 #### 二、如何在Hibernate中使用原生SQL? 给定代码示例中的`...
总结来说,模仿Hibernate生成SQL语句需要对Hibernate的ORM机制有深入理解,包括实体类的定义、属性映射、查询API的使用,以及Java反射的应用。通过这种方式,开发者可以自定义查询逻辑,同时利用Hibernate的强大功能...
hibernate.show_sql 参数用于输出所有 SQL 语句到控制台。其取值为 true 或 false。当设置为 true 时,Hibernate 将输出所有 SQL 语句到控制台,方便开发者调试和优化数据库操作。 3. hibernate.format_sql ...
在开发和调试基于Hibernate的Java应用时,有时我们需要获取到SQL语句的完整形式,而不仅仅是Hibernate默认输出的参数化形式。在这种情况下,P6Spy是一个非常有用的工具。P6Spy是一个开源的JDBC代理库,它允许我们...
这篇博客“使用p6spy完整显示hibernate的SQL语句”可能详细解释了如何配置和使用p6spy来跟踪Hibernate生成并执行的SQL。 首先,`p6spy`是一个Java数据库代理库,它可以拦截并记录所有通过JDBC发送到数据库的SQL语句...
首先,本地SQL查询(Native SQL)是指直接在Hibernate中使用原生的SQL语句进行查询,而不是使用HQL(Hibernate Query Language)。这允许开发者充分利用SQL的功能,比如进行复杂的统计计算或者处理特定数据库的特性...
本篇文章主要探讨如何利用Hibernate实现动态SQL查询,结合XML配置和FREEMARKER模板引擎来生成执行的SQL语句。 一、Hibernate简介 Hibernate作为一款强大的持久层框架,它简化了Java应用程序与数据库之间的交互。...
通过上述步骤,我们就可以在Hibernate项目中方便地使用配置文件中的SQL语句了。这种方式提高了代码的可读性和可维护性,特别是在处理复杂SQL时,避免了硬编码SQL到Java代码中。同时,它还支持参数化查询,能够有效...
总的来说,Java打印漂亮的SQL语句是一个提高开发效率和代码质量的有效方法,通过使用如"PrettySQLFormatter"这样的工具,可以使得复杂的SQL查询变得更容易理解和维护,这对于大型项目或者涉及大量SQL操作的开发工作...
这篇博客文章“Hibernate使用xdoclet生成映射文件和sql语句”可能详细介绍了如何结合这两个工具进行开发。 在早期的Java开发中,XDoclet是基于Javadoc注解的工具,它可以解析Java类中的特定注解,并根据这些注解...
使用本地sql语句查询后,无需再使用Object对查询结果进行强制转换,而是直接将查询结果放到实体Bean里了。 PS: 其实只有一版,这里只所以叫最终版是因为该附件我上传了好几天传不上去,到最后报告说‘资源已经存在...
"Java使用注解拼接SQL语句"是一个常见的实践,它使得动态构建SQL查询变得更为简洁和可维护。这种技术通常与ORM(对象关系映射)框架如MyBatis或Hibernate结合使用,但也可以通过自定义处理逻辑实现。 1. **自定义...
使用问号参数化查询是编写安全、高效SQL语句的关键实践。它不仅可以防范SQL注入,还能优化性能,同时减少因字符串拼接导致的潜在错误。在Java等编程语言中,通过`PreparedStatement`接口,我们可以轻松实现这一功能...
除了ORM框架,还可以使用存储过程或者ADO.NET的DataSet/DataTable等方式进行无SQL语句的数据库操作。存储过程是在数据库端预编译的SQL代码集合,可以在C#中调用,减少了网络传输和解析SQL的成本。ADO.NET虽然直接...
在开发过程中,为了调试和优化SQL查询,有时我们需要查看Hibernate生成的完整SQL语句,包括其参数值。通常,Hibernate默认输出的SQL语句会用问号(?)作为占位符,这在理解查询逻辑时可能会带来不便。本文将详细介绍...
在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者通过面向对象的方式来操作数据库,而无需直接编写SQL语句。在这个场景中,我们将探讨如何使用Hibernate与SQL Server 2005数据库进行...
然而,为了提高代码的可维护性和安全性,开发者可以选择使用ORM(对象关系映射)框架,如Hibernate或MyBatis,它们允许我们在不直接编写SQL语句的情况下操作数据库。在这个"java操作mysql数据库,不写sql语句版"的...