java hibernate显示sql 原生sql查询。

使用Hibernate SQLQuery执行原生SQL - 推酷
使用Hibernate SQLQuery执行原生SQL
Hibernate对原生SQL查询的支持和控制是通过SQLQuery接口实现的。通过Session接口,我们能够很方便的创建一个SQLQuery(SQLQuery是一个接口,在Hibernate4.2.2之前,默认返回的是SQLQuery的实现类——SQLQueryImpl对象,在下文中出现的SQLQuery如非注明,都是指该子类)对象来进行原生SQL查询:
session.createSQLQuery(String sql);
SQLQuery实现了Query接口,因此你可以使用Query接口中提供的API来获取数据。
最简单的示例
//获取所有查询结果
session.createSQLQuery(&select * from note&).list();
//仅获取第一条结果
session.createSQLQuery(&select * from note where id = 1&).uniqueResult();
使用预处理SQL
预处理SQL的好处自然不必多说,除了众所周知的能够防止SQL注入攻击外,还能够在一定程度上提高SQL的查询效率。SQLQuery提供了众多的接口来分别设置不同类型的参数,诸如setBigDecimal、setBinary、setDouble等,详参SQLQuery的JavaDoc,此处不再赘述。这里仅重点说一下通用的SQL参数设置接口setParameter。
如下代码示范了如何使用SQLQuery执行预处理SQL:
SQLQuery query = session.createSQLQuery(&select * from note where id = ?&);
//设置第一个参数的值为12,即查询ID=12的note
query.setParameter(0, 12);
List list = query.list();
这里需要注明一点,
无论是通过不同类型参数的设置接口来设置SQL参数,还是通过setParameter来设置参数,下标都是从0开始的,而不是从1开始的
使用自定义的结果转换器处理查询结果
SQLQuery接口预留了setResultTransformer接口以实现使用用户自定义的ResultTransformer结果集转换器处理查询结果。ResultTransformer接口非常简单,只有两个方法,分别用来转换单行数据和所有结果数据。经过自定义ResultTransformer生成的实体,并未加入Session,因此是非受管实体。
如下代码,示范了如何将单行数据装入LinkedHashMap对象中:
query.setResultTransformer(new ResultTransformer() {
public Object transformTuple(Object[] values, String[] columns) {
Map&String, Object& map = new LinkedHashMap&String, Object&(1);
int i = 0;
for(String column : columns){
map.put(column, values[i++]);
public List transformList(List list) {
如果不设置自定义的ResultTransformer转换器,则Hibernate将每行返回结果的数据按照结果列的顺序装入Object数组中。
这里介绍一个工具类:
Transformers
,它提供了一些常用的转换器,能够帮助我们快速转换结果集,如
Transformers.aliasToBean(Note.class)
能够将查询结果依别名注入到Note实体中。
使用SQLQuery执行原生SQL时,Hibernate会使用ResultSetMetadata来判定返回的标量值的实际顺序和类型。如果要避免过多的使用ResultSetMetadata,或者只是为了更加明确的指名返回值,可以使用addScalar()。
session.createSQLQuery(&select * from note where id = 1&)
.addScalar(&id&, LongType.INSTANCE)
.addScalar(&name&, StringType.INSTANCE)
.addScalar(&createtime&, DateType.INSTANCE);
这个查询指定了SQL查询字符串,要返回的字段和类型.它仍然会返回Object数组,但是此时不再使用ResultSetMetdata,而是明确的将id,name和createtime按照Long, String和Date类型从resultset中取出。同时,也指明了就算query是使用*来查询的,可能获得超过列出的这三个字段,也仅仅会返回这三个字段。
对全部或者部分的标量值不设置类型信息也是可以的:
session.createSQLQuery(&select * from note where id = 1&)
.addScalar(&id&)
.addScalar(&name&)
.addScalar(&createtime&, DateType.INSTANCE);
没有被指定类型的字段将仍然使用ResultSetMetdata获取其类型。
,字段不区分大小写,同时不能够指定不存在的字段
关于从ResultSetMetaData返回的java.sql.Types是如何映射到Hibernate类型,是由方言(Dialect)控制的。假若某个指定的类型没有被映射,或者不是你所预期的类型,你可以通过Dialet的registerHibernateType调用自行定义。
如果仅指定了一个scalar,那么...
Date createTime = (Date)session.createSQLQuery(&select * from note where id = 1&)
.addScalar(&createtime&, DateType.INSTANCE)
.uniqueResult();
如果我们的SQL语句使用了聚合函数,如count、max、min、avg等,且返回结果仅一个字段,那么Hibernate提供的这种提取标量结果的方式就非常便捷了。
上面的查询都是返回标量值的,也就是从resultset中返回的“裸”数据。下面展示如何通过addEntity()让原生查询返回实体对象。
session.createSQLQuery(&select * from note where id = 1&).addEntity(Note.class);
session.createSQLQuery(&select id,name,createtime from note where id = 1&).addEntity(Note.class);
这个查询指定SQL查询字符串,要返回的实体。假设Note被映射为拥有id,name和createtime三个字段的类,以上的两个查询都返回一个List,每个元素都是一个Note实体。
假若实体在映射时有一个many-to-one的关联指向另外一个实体,在查询时必须也返回那个实体,否则会导致发生一个&column not found&的数据库错误。这些附加的字段可以使用*标注来自动返回,但我们希望还是明确指明,看下面这个具有指向Dog的many-to-one的例子:
session.createSQLQuery(&select id,note,createtime,author from note where id = ?&).addEntity(Note.class);
author字段即为Note实体和Author实体的关联字段,只需在查询时得到该字段的值,Hibernate即可使用该值找到对应的关联实体。如上例中,note.getAuthor()即可返回当前Note所属的Author对象。
处理关联和集合类
通过提前抓取将Author连接获得,而避免初始化proxy带来的额外开销也是可能的。这是通过addJoin()方法进行的,这个方法可以让你将关联或集合连接进来。
session.createSQLQuery(&select {note.*}, {author.*} from note note, user author where note.author = author.id&)
.addEntity(&note&, Note.class)
.addJoin(&author&, &note.author&);
上面的例子是多对一的关联查询,反过来做一对多的关联查询也是可以的。如下的例子中,author.notes表示该用户发表的所有日记(Note),Set集合类型:&
session.createSQLQuery(&select {author.*},{note.*} from note note, user author where author.id = ? and note.author = author.id&)
.addEntity(&author&, User.class)
.addJoin(&note&, &author.notes&);
join查询会在每行返回多个实体对象,处理时需要注意
别名和属性引用
假若SQL查询连接了多个表,同一个字段名可能在多个表中出现多次,这会导致SQL错误。不过在我们可以通过使用占位符来完美地解决这一问题。
其实在上例中已经用到了占位符:
session.createSQLQuery(&select {note.*}, {author.*} from note note, user author where note.author = author.id&)
.addEntity(&note&, Note.class)
.addJoin(&author&, &note.author&);
这个查询指明SQL查询语句,其中包含占位附来让Hibernate注入字段别名,查询并返回的实体。
上面使用的{note.*}和{author.*}标记是作为“所有属性”的简写形式出现的,当然你也可以明确地罗列出字段名。但如下的范例代码中我们让Hibernate来为每个属性注入SQL字段别名,字段别名的占位符是表别名 + . + 属性名。
属性名区分大小写,而且不能够在where子句中使用占位符
SQLQuery query = session.createSQLQuery(&select note.id as {note.id},note as {note.note},createtime as {note.createTime},author as {note.author}, {author.*} from note, user author where note.id = ? and note.author = author.id&);
query.addEntity(&note&, Note.class);
query.addJoin(&author&, &note.author&);
大多数情况下,上面的别名注入方式可以满足需要,但在使用更加复杂的映射,比如复合属性、通过标识符构造继承树,以及集合类等等情况下,则需要更加复杂的别名注入方式。
下表列出了使用别名注射参数的不同方式:
&别名注入(alias injection names) 描述
&{[aliasname].[propertyname]
&A_NAME as {item.name}
&{[aliasname].[componentname].[propertyname]}
&CURRENCY as {item.amount.currency}, VALUE as {item.amount.value}
&实体辨别器
&{[aliasname].class}
&DISC as {item.class}
&实体的所有属性
&{[aliasname].*}
&集合键(collection key)
&{[aliasname].key}
&ORGID as {coll.key}
&{[aliasname].id}
&EMPID as {coll.id}
&{[aliasname].element}
&XID as {coll.element}
&集合元素的属性
&{[aliasname].element.[propertyname]}
&NAME as {coll.element.name}
&集合元素的所有属性
&{[aliasname].element.*}
&{coll.element.*}
&集合的所有属性
&{[aliasname].*}
在hbm文件中描述结果集映射信息,并在查询中使用
对于一些复杂的结果集映射,往往需要像MyBatis那样在文件中手动配置好,然后在程序中使用。幸运的是Hibernate也提供了类似的功能,你可以使用自己配置的结果集映射来处理返回的结果集数据:
SQLQuery query = session.createSQLQuery(&select note.id as {note.id},note as {note.note},createtime as {note.createTime},author as {note.author}, {author.*} from note, user author where note.id = ? and note.author = author.id&);
//使用在hbm文件中配置的自定义结果集映射
query.setResultSetMapping(&noteAnduthor&);
query.list();
执行更新操作
使用SQLQuery执行数据库更新操作比较容易,除了像查询时那样需要指定SQL语句(如有需要还需设置SQL参数)外,仅需调用executeUpdate()方法,即可提交更新操作。代码如下所示:
session.createSQLQuery(&update createtime = ? from note where note.id = ?&);
query.setDate(0, new Date());
query.setLong(1, 1L);
query.executeUpdate();
executeUpdate方法的返回结果为改变的数据库记录的行数。
已发表评论数()
&&登&&&陆&&
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见本文欢迎转载,转载请注明:转载自中国学网: []
用户还关注
可能有帮助第50课 原生SQL查询 - Hibernate详解 - 好知网
L50原生SQL查询
正在载入视频,请稍等...
小提示:如无法播放此课程视频,请或。
恭喜您完成了该课时的学习,还有3课时未学,
该操作需要登录,请先或。
课程创建人
IT达人,分享了众多IT开发和软件使用教程。
课程最新笔记
内容回顾Hibernate是ORM轻量级的框架
detache对象是可以update
commit之前做脏数据的检查。数据的加载getload
课程最新问题
相关小组最新话题
学习路上要有伙伴同行!
每天同学们在这儿学习数万课时,登录后一起学习交流吧。
已有好知网帐号? 也可从合作网站帐号登录:tiny-sql地图1.0.1发布,用来弥补hibernate原生sql查询的不足_SQL大全_优良自学吧 |
当前位置: >
> tiny-sql地图1.0.1发布,用来弥补hibernate原生sql查询的不足优良自学吧提供tiny-sql地图1.0.1发布,用来弥补hibernate原生sql查询的不足,tiny-sqlmap1.0.1发布,用来弥补hibernate原生sql查询的不足 tiny-sqlmap的由来 最近给一个项目的框架做一些优化工作,该项目使用的是SSH这一套东西。似乎SSH在某些人眼里已经形成了一种惯性,做个web应用如果不用tiny-sqlmap1.0.1发布,用来弥补hibernate原生sql查询的不足
tiny-sqlmap的由来
最近给一个项目的框架做一些优化工作,该项目使用的是SSH这一套东西。似乎SSH在某些人眼里已经形成了一种惯性,做个web应用如果不用这SSH一套东西他都觉得那里不舒服似的,从不考虑自身应用的特点而选择合适的技术框架。不从实际出发乱选不合符本应用的技术框架必定带来不好的后果。对于我优化的这个项目而言,hibernate并没有给项目的开发效率提高,因为很多的查询都是使用了jdbcTemplate,导至以下问题:
做个列表查询,用if判断查询条件,用StringBuffer拼装sql语句这样的代码占用整个业务方法,使得代码变得臃肿不可读。
Sql写在程序文件里,用StringBuffer 拼装,这好比看了被压缩了得js代码一样难理解。
SQL StringBuffer 拼装在应用随处可见,在Action,Service,Dao都有。
SQL 注入得不到统一的控制。
Hibernate在对数据表的修改确实体现了极佳的开发效率,对上面这些问题的优化,我并没有选择推翻重来,而是在ibatis的基础上开发了个查询框架来解决上述的问题。
什么是tiny-sqlmap
tiny-sqlmap框架是从ibatis框架中剥离出来的,它非常的轻巧,也好扩冲。它仅提供sql的查询功能,对sql的查询操作,它支持SQL结果集映射、sql参数映射、动态sql的等功能。
tiny-sqlmap使用场景
如果你在便用hibernate的过程中也遇到像我这样的问题,你可以将其整合到你的项目中。
如果整合tiny-sqlmap
tiny-sqlmap通过SqlMapExecutor 接口向外部程序提供访问,先看看这个接口所提供的方法
它只提供了相关的数据查询方法。SqlMapExecutor对象由SqlMapExecutorFactoryBean工厂类,这是个spring的FactoryBean,所以要求在spring的环境中运行,SqlMapExecutorFactoryBean的配置如下:
&bean id="sqlMapExecutor" class="org.jorgie.dal.tinysqlmap.client.SqlMapExecutorFactoryBean"&
&property name="dataSource"&
&ref bean="dataSource"/&
&/property&
&property name="sqlMapExecutorProperties"&
&prop key="sql_executor_class" &org.jorgie.dal.tinysqlmap.engine.execution.LimitSqlExecutor&/prop&
&prop key="dialect_class" &org.jorgie.dal.tinysqlmap.engine.dialects.MySQLDialect&/prop&
&/property&
&property name="sqlMapConfigLocation"&
&value&test/entity/sqlMap/testSqlMap.xml&/value&
&value&test/entity/sqlMap/demoSqlMap.xml&/value&
&/property&
dataSource是spring中配置的数据源对象。在sqlMapExecutorProperties中配置两个属性的作用是为了实现List queryForList(String id, Object parameterObject, int startIndex, int limit)实现分页功能。对于sqlmap xml文件的配置,配置方法和ibatis是一致的,只不过它只支持select语句的配置。
如果保证与hibernate的事务一致?把tiny-sqlmap整合到你的应用中,你需要把你的事务管理器改成DataSourceTransactionManager,同时需要为配置在spring容器的LocalSessionFactoryBean对象将其useTransactionAwareDataSource属性设为true。 SqlMapExecutorFactoryBean内部会对数据源进行包装,通过使用TransactionAwareDataSourceProxy数据源来保证与hibernate在同一个事务中使用的是同一个Connection对象。
下面是具休的配置代码:LocalSessionFactoryBean
&bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&
&property name="dataSource"&
&ref bean="dataSource" /&
&/property&
&property name="hibernateProperties"&
&prop key="hibernate.dialect"&org.hibernate.dialect.MySQLInnoDBDialect&/prop&
&prop key="hibernate.show_sql"&true&/prop&
&prop key="hibernate.generate_statistics"&true&/prop&
&prop key="hibernate.connection.release_mode"&auto&/prop&
&prop key="hibernate.autoReconnect"&true&/prop&
&prop key="hibernate.jdbc.batch_size"&30&/prop&
&/property&
&property name="mappingDirectoryLocations"&
&value&classpath:test/entity/&/value&
&/property&
&!--让hibernate Session使用TransactionAwareDataSourceProxy数据源 --&
&property name="useTransactionAwareDataSource" value="true"&&/property&
事务管理器,将HibernateTransactionManager改为DataSourceTransactionManager
&bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&
&property name="dataSource" ref="dataSource" /&
SqlMapExecutorFactoryBean对数据源的包装代码,这里的useTransactionAwareDataSource属生默认为true
if (this.dataSource != null) {
DataSource dataSourceToUse = this.dataS
if (this.useTransactionAwareDataSource
&& !(this.dataSource instanceof TransactionAwareDataSourceProxy)) {
dataSourceToUse = new TransactionAwareDataSourceProxy(
this.dataSource);
state.setDataSource(dataSourceToUse);
state.getConfig().getSqlMapExecutorImpl().setDataSource(dataSourceToUse);
附上源码及库文件,欢迎便用!
转载(/topic/1130793)
(本文来自互联网,不代表搜站(/)的观点和立场)编辑推荐最近更新Hibernate SQLQuery执行原生SQL
| 红颜丽人
Hibernate SQLQuery执行原生SQL。
Hibernate对原生SQL查询的支持和控制是通过SQLQuery接口实现的,这种方式弥补了HQL、Criterion查询的不足,在操作和使用上往往更加的自由和灵活,如果使用得当,数据库操作的效率还会得到不同程度的提升。
Hibernate对原生 SQL查询的支持和控制是通过SQLQuery接口实现的。通过Session接口,我们能够很方便的创建一个SQLQuery(SQLQuery是一个接口,在Hibernate4.2.2之前,默认返回的是SQLQuery的实现类——SQLQueryImpl对象,在下文中出现的SQLQuery如非注明,都是指该子类)对象来进行原生SQL查询:
session.createSQLQuery(String sql);
SQLQuery实现了Query接口,因此你可以使用Query接口中提供的API来获取数据。
最简单的示例
//获取所有查询结果 session.createSQLQuery(“select * from note”).list(); //仅获取第一条结果 session.createSQLQuery(“select * from note where id = 1″).uniqueResult();
使用预处理SQL
预处理SQL的好处自然不必多说,除了众所周知的能够防止SQL注入攻击外,还能够在一定程度上提高SQL的查询效率。SQLQuery提供了众多的接口来分别设置不同类型的参数,诸如setBigDecimal、setBinary、setDouble等,详参SQLQuery的JavaDoc,此处不再赘述。这里仅重点说一下通用的SQL参数设置接口setParameter。
如下代码示范了如何使用SQLQuery执行预处理SQL:
SQLQuery query = session.createSQLQuery(“select * from note where id = ?”); //设置第一个参数的值为12,即查询ID=12的note query.setParameter(0, 12); List list = query.list(); …
这里需要注明一点,无论是通过不同类型参数的设置接口来设置SQL参数,还是通过setParameter来设置参数,下标都是从0开始的,而不是从1开始的!
使用自定义的结果转换器处理查询结果
SQLQuery 接口预留了setResultTransformer接口以实现使用用户自定义的ResultTransformer结果集转换器处理查询结果。 ResultTransformer接口非常简单,只有两个方法,分别用来转换单行数据和所有结果数据。经过自定义ResultTransformer生成的实体,并未加入Session,因此是非受管实体。
如下代码,示范了如何将单行数据装入LinkedHashMap对象中:
query.setResultTransformer(new ResultTransformer() { @Override public Object transformTuple(Object[] values, String[] columns) { Map&String, Object& map = new LinkedHashMap&String, Object&(1); int i = 0; for(String column : columns){ map.put(column, values[i++]); } } @Override public List transformList(List list) { } });
如果不设置自定义的ResultTransformer转换器,则Hibernate将每行返回结果的数据按照结果列的顺序装入Object数组中。
这里介绍一个工具类:Transformers,它提供了一些常用的转换器,能够帮助我们快速转换结果集,如Transformers.aliasToBean(Note.class)能够将查询结果依别名注入到Note实体中。
使用SQLQuery执行原生SQL时,Hibernate会使用ResultSetMetadata来判定返回的标量值的实际顺序和类型。如果要避免过多的使用ResultSetMetadata,或者只是为了更加明确的指名返回值,可以使用addScalar()。
session.createSQLQuery(“select * from note where id = 1″) .addScalar(“id”, LongType.INSTANCE) .addScalar(“name”, StringType.INSTANCE) .addScalar(“createtime”, DateType.INSTANCE);
这个查询指定了SQL查询字符串,要返回的字段和类型.它仍然会返回Object数组,但是此时不再使用ResultSetMetdata,而是明确的将id,name和 createtime按照Long, String和Date类型从resultset中取出。同时,也指明了就算query是使用*来查询的,可能获得超过列出的这三个字段,也仅仅会返回这三个字段。
对全部或者部分的标量值不设置类型信息也是可以的:
session.createSQLQuery(“select * from note where id = 1″) .addScalar(“id”) .addScalar(“name”) .addScalar(“createtime”, DateType.INSTANCE);
没有被指定类型的字段将仍然使用ResultSetMetdata获取其类型。注意,字段不区分大小写,同时不能够指定不存在的字段!
关于从ResultSetMetaData返回的java.sql.Types是如何映射到Hibernate类型,是由方言(Dialect)控制的。假若某个指定的类型没有被映射,或者不是你所预期的类型,你可以通过Dialet的registerHibernateType调用自行定义。
如果仅指定了一个scalar,那么…
Date createTime = (Date)session.createSQLQuery(“select * from note where id = 1″) .addScalar(“createtime”, DateType.INSTANCE) .uniqueResult();
如果我们的SQL语句使用了聚合函数,如count、max、min、avg等,且返回结果仅一个字段,那么Hibernate提供的这种提取标量结果的方式就非常便捷了。
上面的查询都是返回标量值的,也就是从resultset中返回的“裸”数据。下面展示如何通过addEntity()让原生查询返回实体对象。
session.createSQLQuery(“select * from note where id = 1″).addEntity(Note.class); session.createSQLQuery(“select id,name,createtime from note where id = 1″).addEntity(Note.class);
这个查询指定SQL查询字符串,要返回的实体。假设Note被映射为拥有id,name和createtime三个字段的类,以上的两个查询都返回一个List,每个元素都是一个Note实体。
假若实体在映射时有一个many-to-one的关联指向另外一个实体,在查询时必须也返回那个实体,否则会导致发生一个”column not found”的数据库错误。这些附加的字段可以使用*标注来自动返回,但我们希望还是明确指明,看下面这个具有指向Dog的many-to-one的例子:
session.createSQLQuery(“select id,note,createtime,author from note where id = ?”).addEntity(Note.class);
author字段即为Note实体和Author实体的关联字段,只需在查询时得到该字段的值,Hibernate即可使用该值找到对应的关联实体。如上例中,note.getAuthor()即可返回当前Note所属的Author对象。
处理关联和集合类
通过提前抓取将Author连接获得,而避免初始化proxy带来的额外开销也是可能的。这是通过addJoin()方法进行的,这个方法可以让你将关联或集合连接进来。
session.createSQLQuery(“select {note.*}, {author.*} from note note, user author where note.author = author.id”) .addEntity(“note”, Note.class) .addJoin(“author”, “note.author”);
上面的例子是多对一的关联查询,反过来做一对多的关联查询也是可以的。如下的例子中,author.notes表示该用户发表的所有日记(Note),Set集合类型:
session.createSQLQuery(“select {author.*},{note.*} from note note, user author where author.id = ? and note.author = author.id”) .addEntity(“author”, User.class) .addJoin(“note”, “author.notes”);
注意:join查询会在每行返回多个实体对象,处理时需要注意。
别名和属性引用
假若SQL查询连接了多个表,同一个字段名可能在多个表中出现多次,这会导致SQL错误。不过在我们可以通过使用占位符来完美地解决这一问题。
其实在上例中已经用到了占位符:
session.createSQLQuery(“select {note.*}, {author.*} from note note, user author where note.author = author.id”) .addEntity(“note”, Note.class) .addJoin(“author”, “note.author”);
这个查询指明SQL查询语句,其中包含占位附来让Hibernate注入字段别名,查询并返回的实体。
上面使用的{note.*}和{author.*}标记是作为“所有属性”的简写形式出现的,当然你也可以明确地罗列出字段名。但如下的范例代码中我们让Hibernate来为每个属性注入SQL字段别名,字段别名的占位符是表别名 + . + 属性名。
注意:属性名区分大小写,而且不能够在where子句中使用占位符。
SQLQuery query = session.createSQLQuery(“select note.id as {note.id},note as {note.note},createtime as {note.createTime},author as {note.author}, {author.*} from note, user author where note.id = ? and note.author = author.id”); query.addEntity(“note”, Note.class); query.addJoin(“author”, “note.author”);
大多数情况下,上面的别名注入方式可以满足需要,但在使用更加复杂的映射,比如复合属性、通过标识符构造继承树,以及集合类等等情况下,则需要更加复杂的别名注入方式。
下表列出了使用别名注射参数的不同方式:
别名注入(alias injection names) 描述
{[aliasname].[propertyname]
A_NAME as {item.name}
{[aliasname].[componentname].[propertyname]}
CURRENCY as {item.amount.currency}, VALUE as {item.amount.value}
实体辨别器
{[aliasname].class}
DISC as {item.class}
实体的所有属性
{[aliasname].*}
集合键(collection key)
{[aliasname].key}
ORGID as {coll.key}
{[aliasname].id}
EMPID as {coll.id}
{[aliasname].element}
XID as {coll.element}
集合元素的属性
{[aliasname].element.[propertyname]}
NAME as {coll.element.name}
集合元素的所有属性
{[aliasname].element.*}
{coll.element.*}
集合的所有属性
{[aliasname].*}
在hbm文件中描述结果集映射信息,并在查询中使用
对于一些复杂的结果集映射,往往需要像MyBatis那样在文件中手动配置好,然后在程序中使用。幸运的是Hibernate也提供了类似的功能,你可以使用自己配置的结果集映射来处理返回的结果集数据:
SQLQuery query = session.createSQLQuery(“select note.id as {note.id},note as {note.note},createtime as {note.createTime},author as {note.author}, {author.*} from note, user author where note.id = ? and note.author = author.id”); //使用在hbm文件中配置的自定义结果集映射 query.setResultSetMapping(“noteAnduthor”); query.list();
执行更新操作
使用SQLQuery执行数据库更新操作比较容易,除了像查询时那样需要指定SQL语句(如有需要还需设置SQL参数)外,仅需调用executeUpdate()方法,即可提交更新操作。代码如下所示:
session.createSQLQuery(“update createtime = ? from note where note.id = ?”); query.setDate(0, new Date()); query.setLong(1, 1L); query.executeUpdate();
executeUpdate方法的返回结果为改变的数据库记录的行数。
本文链接地址:
本条目发布于 。属于
分类。作者是 。

我要回帖

更多关于 hibernate sql查询 的文章

 

随机推荐