`

createsqlquery

 
阅读更多

来源:http://bbs.xml.org.cn/blog/more.asp?name=lhwork&id=15351


1,从Hibernate 3.0.x/3.1.x升级到最新的3.2版,一定要注意,3.2版的很多sql函数如count(), sum()的唯一返回值已经从Integer变为Long,如果不升级代码,会得到一个ClassCastException。

这个变化主要是为了兼容JPA,可以在hibernate.org的最新文档中找到说明。

Hibernate Team也提供了一个与原来兼容的解决方案:

  Configuration classicCfg = new Configuration();
  classicCfg.addSqlFunction( "count", new ClassicCountFunction());
  classicCfg.addSqlFunction( "avg", new ClassicAvgFunction());
  classicCfg.addSqlFunction( "sum", new ClassicSumFunction());
  SessionFactory classicSf = classicCfg.buildSessionFactory();

int count = ((Integer)q.uniqueResult()).intValue();

改成 int count = ((Number)q.uniqueResult()).intValue(); 这样就可以两个版本同时兼容.

2,hibernate3.2要求ehcache1.2

3,session.createSQLQuery(sql).executeUpdate();这个hibernate3.0.5不支持,而hibernate3.2支持

  session.createSQLQuery(fsql).addScalar("singlevalue",
                        Hibernate.DOUBLE).uniqueResult();这个到了3.2就不需要addScalar了.

4,session.createSQLQuery(sql).addEntity(Class class);hibernate3.0.5不支持,单个参数的addEntity方法

 

5,hibernate3.2可以对原生sql 查询使用ResultTransformer。这会返回不受Hibernate管理的实体。
sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
        .setResultTransformer(Transformers.aliasToBean(CatDTO.class))

或setResultTransformer(new AliasToBeanResultTransformer(CatDTO.class))
上面的查询将会返回CatDTO的列表,它将被实例化并且将NAME和BIRTHDAY的值注射入对应的属性或者字段。

但必须注意,对每一个列都必须addScalar("列名")


6,setResultTransformer与addEntity的一个区别是前者支持查任意的列,后者必须用select * from users的形式或select {a.*},{b.*} from a,b where ....。

7,Map vs. Object[]

Since you can also use a transformer that return a Map from alias to value/entity (e.g. Transformers.ALIAS_TO_MAP), you are no longer required to mess with index based Object arrays when working with a result.

  1. List iter = s.createQuery(   
  2.   "select e.student.name as studentName," +   
  3.   "       e.course.description as courseDescription" +   
  4.   "from   Enrolment as e")   
  5.   .setResultTransformer( Transformers.ALIAS_TO_MAP )   
  6.   .iterate();  

String name = (Map)(iter.next()).get("studentName");
Again, this works equally well for Criteria, HQL and native SQL.

 

//===========

val sql = "select distinct story as story from ..."; 
val q
: Query = getEntityManager().createNativeQuery(sql); 
//hello nasty hack 
q
.asInstanceOf[HibernateQuery].getHibernateQuery().asInstanceOf[SQLQuery].addScalar("story", StandardBasicTypes.LONG); 
//next, caching   
q
.setHint("org.hibernate.cacheable", true); 
q
.setHint("org.hibernate.cacheRegion", "query.getTopLinks"); 
//=======================

q2.unwrap(SQLQuery.class).addScalar("sc_cur_code", StringType.INSTANCE); 

分享到:
评论

相关推荐

    hibernate 的createSQLQuery的几种用法

    Hibernate 的 createSQLQuery 的几种用法 Hibernate 的 createSQLQuery 是 Hibernate 框架中的一种强大且灵活的查询机制,它允许开发者使用原生 SQL 语句来查询数据库。下面是 createSQLQuery 的几种常见用法: 一...

    关于hibernate 的createQuery和createSqlQuery 的区别

    Hibernate 中的 createQuery 和 createSqlQuery 区别详解 在 Hibernate 中,createQuery 和 createSqlQuery 是两个常用的查询方法,但是它们之间存在着一些关键的区别。了解这两个方法的差异对于正确地使用 ...

    在Java的Hibernate框架中使用SQL语句的简单介绍

    在Hibernate中,你可以通过`Session`对象的`createSQLQuery`方法创建一个SQL查询。例如: ```java Query query = session.createSQLQuery("select * from t_user usr"); ``` 执行上述代码后,Hibernate将会执行...

    Native SQL查询 (使用SQLQuery).doc

    在 Hibernate 中,使用 SQLQuery 可以执行 Native SQL 查询,控制查询的执行是通过 SQLQuery 接口进行的,通过执行 Session.createSQLQuery() 获取这个接口。下面将详细介绍如何使用这个 API 进行查询。 标量查询...

    ceateQuery ceateSQLQuery

    在使用Hibernate进行数据查询时,我们常常会遇到两种方式来构造查询:`createQuery`和`createSQLQuery`。这两种方法都是Hibernate提供的,但它们在功能和使用上有所不同。 `createQuery`是基于Hibernate Query ...

    hibernate query调用oracle存储过程

    在IT行业中,数据库管理和数据操作是至关重要的环节。Oracle数据库作为企业级的主流数据库系统,提供了丰富的存储过程和函数功能,以实现复杂的数据处理逻辑。而Hibernate作为一种流行的Java持久化框架,它允许...

    hibernate执行原生sql语句

    Hibernate 提供了多种方式来执行原生 SQL 语句,其中之一是使用 `Session.createSQLQuery()` 方法,该方法返回一个 `SQLQuery` 对象,该对象提供了执行原生 SQL 语句的方法。 例如,我们可以使用以下代码来执行一个...

    Hibernate+本地SQL查询SQLQuery宣贯.pdf

    首先,创建SQLQuery实例是通过Session对象的createSQLQuery()方法完成的。例如: ```java List<Cat> cats = sess.createSQLQuery("select * from cats").addEntity(Cat.class).list(); ``` 上述代码会执行一个简单...

    Query对象setResultTransFormer()

    Query 对象可以通过 Session 对象的 createSQLQuery() 或 createQuery() 方法创建,例如: ```java Session session = sf.openSession(); Query query = session.createSQLQuery("select * from Tree t where pid in...

    Hibernate+本地SQL查询SQLQuery.pdf

    要执行本地SQL查询,首先需要通过Session对象的createSQLQuery()方法创建SQLQuery实例。例如: ```java List<Cat> cats = sess.createSQLQuery("select * from cats").addEntity(Cat.class).list(); ``` 这段...

    Hibernate --调用存储过程(全).docx

    3. **使用`createSQLQuery`方法**:这是更灵活的方式,可以直接在`Session`上创建`SQLQuery`对象来执行存储过程: ```java Session session = HibernateSessionFactory.getSession(); SQLQuery query = session....

    Hibernat使用原生的SQL

    1. **Session.createSQLQuery()**: 这是最常见的方法,通过SessionFactory的openSession()创建Session实例,然后调用createSQLQuery()方法,传入SQL语句。例如: ```java Session session = sessionFactory....

    Native-SQL查询 (1).ppt

    Hibernate提供`Session`接口的`createSQLQuery()`方法来创建一个`SQLQuery`对象,用于执行原生的SQL查询。例如,以下代码展示了如何通过Native SQL获取`guestbook`表的所有记录,并打印结果: ```java ...

    Hibernate3调用存储过程用法

    Hibernate3通过Query对象的createSQLQuery方法提供对存储过程的调用支持。它允许我们编写原生的SQL语句,包括调用存储过程,然后映射结果到Java对象。 三、具体步骤 1. **创建SQL查询** 使用Session的...

    hibernate 执行原生sql的几种方式

    Hibernate的`Session`接口提供了`createSQLQuery()`方法,允许我们直接编写SQL语句。例如: ```java Session session = sessionFactory.openSession(); SQLQuery query = session.createSQLQuery("SELECT * FROM...

    hibernate3中通过nativesql或取部分字段并映射为具体对象的实现

    通过`Session`对象的`createSQLQuery`方法,我们可以创建一个`SQLQuery`实例,然后设置SQL语句: ```java Session session = HibernateUtil.getSessionFactory().openSession(); SQLQuery sqlQuery = session....

    Hibernate SQLQuery 本地查询

    在Hibernate中,Session对象提供了createSQLQuery()方法来创建SQLQuery实例。你可以通过这个实例设置SQL查询语句,比如: ```java Session session = HibernateUtil.getSessionFactory().openSession(); SQLQuery ...

    hibernate调用存储过程知识.pdf

    在实现过程中,需要注意的是,由于Hibernate主要设计用于处理对象,所以调用存储过程时需要使用`createSQLQuery`而不是`createQuery`。此外,存储过程的调用格式通常为`CALL procedure_name()`。 总结来说,这篇...

Global site tag (gtag.js) - Google Analytics