`
javasss
  • 浏览: 66957 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类
最新评论

在hibernate框架下使用Transformers调用sql

 
阅读更多
People using the Criteria API have either transparently or knowingly used a ResultTransformer. A ResultTransformer is a nice and simple interface that allows you to transform any Criteria result element. E.g. you can make any Criteria result be returned as a java.util.Map or as a non-entity Bean.

Criteria TransformersImagine you have a StudentDTO class:
public class StudentDTO

   private String studentName; 
   private String courseDescription;  
   public StudentDTO() {  }       
   ...
}
Then you can make the Criteria return non-entity classes instead of scalars or entities by applying a ResultTransformer:

List resultWithAliasedBean = s.createCriteria(Enrolment.class)
     .createAlias("student", "st").createAlias("course", "co")
     .setProjection( Projections.projectionList()              
                          .add( Projections.property("st.name"), "studentName" )                  
                          .add( Projections.property("co.description"), "courseDescription" )          )         
     .setResultTransformer( Transformers.aliasToBean(StudentDTO.class) )        
      .list();
StudentDTO dto = (StudentDTO)resultWithAliasedBean.get(0);  
This is how ResultTransformer have been available since we introduced projection to the Criteria API in Hibernate 3.
It is just one example of the built in transformers and users can provide their own transformers if they so please.
Jealous programming Since I am more a HQL/SQL guy I have been jealous on Criteria for having this feature and I have seen many requests for adding it to all our query facilities.
Today I put an end to this jealousy and introduced ResultTransformer for HQL and SQL in Hibernate 3.2.
HQL TransformersIn HQL we already had a "kind" of result transformers via the ("select new" http://www.hibernate.org/hib_docs/v3/reference/en/html/queryhql.html#queryhql-select) syntax, but for returning non-entity beans it only provided value injection of these beans via its constructor. Thus if you used the same DTO in many different scenarios you could end up having many constructors on this DTO purely for allowing the "select new" functionality to work.
Now you can get the value injected via property methods or fields instead, removing the need for explicit constructors.

List resultWithAliasedBean = s.createQuery(  "select e.student.name as studentName," +  "       e.course.description as courseDescription" +  "from   Enrolment as e")
       .setResultTransformer( Transformers.aliasToBean(StudentDTO.class))  .list();

StudentDTO dto = (StudentDTO) resultWithAliasedBean.get(0);
  
SQL TransformersWith native sql returning non-entity beans or Map's is often more useful instead of basic Object[]. With result transformers that is now possible.

List resultWithAliasedBean = s.createSQLQuery(  "SELECT st.name as studentName, co.description as courseDescription " +  "FROM Enrolment e " +  "INNER JOIN Student st on e.studentId=st.studentId " +  "INNER JOIN Course co on e.courseCode=co.courseCode")
     .addScalar("studentName")  .addScalar("courseDescription")
     .setResultTransformer( Transformers.aliasToBean(StudentDTO.class))
    .list();

StudentDTO dto =(StudentDTO) resultWithAliasedBean.get(0);

  
Tip: the addScalar() calls were required on HSQLDB to make it match a property name since it returns column names in all uppercase (e.g. "STUDENTNAME"). This could also be solved with a custom transformer that search the property names instead of using exact match - maybe we should provide a fuzzyAliasToBean() method ;)
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.

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

String name = (Map)(iter.next()).get("studentName");

  
Again, this works equally well for Criteria, HQL and native SQL.

使用SQLQuery
对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口。最简单的情况下,我们可以采用以下形式:

List cats = sess.createSQLQuery( " select * from cats " ).addEntity(Cat. class ).list();这个查询指定了:

SQL查询字符串

查询返回的实体

这里,结果集字段名被假设为与映射文件中指明的字段名相同。对于连接了多个表的查询,这就可能造成问题,因为可能在多个表中出现同样名字的字段。下面的方法就可以避免字段名重复的问题:

List cats = sess.createSQLQuery( " select {cat.*} from cats cat " ).addEntity( " cat " , Cat. class ).list();
这个查询指定了:

SQL查询语句,它带一个占位符,可以让Hibernate使用字段的别名.

查询返回的实体,和它的SQL表的别名.

addEntity()方法将SQL表的别名和实体类联系起来,并且确定查询结果集的形态。

addJoin()方法可以被用于载入其他的实体和集合的关联.

List cats = sess.createSQLQuery(
" select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id " )
.addEntity( " cat " , Cat. class )
.addJoin( " kitten " , " cat.kittens " )
.list();
原生的SQL查询可能返回一个简单的标量值或者一个标量和实体的结合体。

Double max = (Double) sess.createSQLQuery( " select max(cat.weight) as maxWeight from cats cat " )
.addScalar( " maxWeight " , Hibernate.DOUBLE);
.uniqueResult();
除此之外,你还可以在你的hbm文件中描述结果集映射信息,在查询中使用。

List cats = sess.createSQLQuery(
" select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id " )
.setResultSetMapping( " catAndKitten " )
.list();
命名SQL查询
可以在映射文档中定义查询的名字,然后就可以象调用一个命名的HQL查询一样直接调用命名SQL查询.在这种情况下,我们不 需要调用addEntity()方法.

< sql - query name = " persons " >
< return alias = " person " class = " eg.Person " />
Select person.NAME AS {person.name},person.AGE AS {person.age},person.SEX AS {person.sex} FROM PERSON person Where person.NAME LIKE :namePattern
</ sql - query >List people = sess.getNamedQuery( " persons " ).setString( " namePattern " , namePattern)
.setMaxResults( 50 )
.list();
分享到:
评论

相关推荐

    Hibernate中Sql语句

    虽然HQL是Hibernate提供的面向对象的语言,能够方便地映射到Java对象,但在某些场景下使用原生SQL更加灵活高效,例如: - **复杂查询**:当需要执行复杂的数据库操作时,如分组、聚合、子查询等,原生SQL能更好地...

    hibernate将本地SQL查询结果封装成对象

    在某些情况下,本地SQL查询的性能可能会优于HQL,因为它避免了Hibernate对HQL的解析和转换过程。 要将本地SQL查询的结果封装成对象,我们首先需要定义一个映射文件(.hbm.xml),在这个文件中,我们需要指定查询...

    hibernate将本地SQL查询结果封装成对象(最终).zip

    在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库,极大地简化了数据库操作。本教程将详细解释如何使用Hibernate将本地SQL查询的结果封装成对象,以便...

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

    在Java的持久化框架Hibernate中,开发者经常需要根据特定需求查询数据库并返回对象。`Hibernate3` 提供了丰富的API来实现这样的功能,包括使用原生SQL(Native SQL)进行查询,然后将查询结果映射到Java对象上。这篇...

    Criteria hibernate

    在Java开发中,Hibernate是一个非常流行的持久化框架,它简化了数据库操作,使开发者能够用面向对象的方式来处理数据。本篇内容将聚焦于Hibernate中的Criteria查询,这是一种动态构建SQL查询的方法,无需直接编写SQL...

    Hibernate Criteria 完全使用

    Hibernate Criteria API 是 Hibernate 框架中一个强大的查询工具,它提供了一种面向对象的方式来构建SQL查询,使得开发者无需直接编写SQL语句,即可进行复杂的数据库操作。Criteria API 提供了高度抽象的接口,可以...

    hibernate3使用手册

    《Hibernate3使用手册》是Java开发领域中一本重要的参考资料,主要涵盖了如何利用Hibernate3这个流行的持久化框架进行数据库操作的相关知识。Hibernate3作为Java对象关系映射(ORM)工具的代表,极大地简化了数据库...

    解决Hibernate中MySQL的中文排序

    然而,问题可能依然存在,因为Hibernate在执行SQL查询时默认使用的是数据库的默认排序规则,可能并非我们期望的中文排序。为解决这个问题,我们可以自定义SQL排序语句,或者在实体类的属性上添加注解来指定排序规则...

    Hibernate最新中文帮助文档

    Hibernate是一款开源的对象关系映射(ORM)框架,它允许Java开发者在Java应用程序中处理数据库操作,而无需直接编写SQL语句。ORM框架的核心思想是将数据库中的表与Java类进行映射,使得开发者可以通过操作对象来间接...

    [原]在MyEclipse中开发Hibernate入门

    - 使用Hibernate的Transformers工具类可以将结果转换为自定义类型。 8. **延迟加载和级联操作** - 延迟加载(Lazy Loading)允许只在需要时加载关联对象,提高性能。 - 级联操作(Cascade)可以在一个对象被操作...

    使用Transformers 和 Faiss 构建语义搜索引擎_Jupyter_python

    如何使用 Transformers 和 Faiss 构建语义搜索引擎 如何使用 Streamlit 和 Docker 在 AWS Elastic Beanstalk 上部署机器学习模型

    Python库 | transformers-3.0.2.tar.gz

    2. **预训练模型**:Transformers库包含了大量的预训练模型,如BERT、GPT、RoBERTa、DistilBERT等,这些模型在诸如GLUE、SQuAD等基准测试上取得了优异成绩,用户可以直接使用或进行微调以适应特定任务。 3. **简单...

    PyPI 官网下载 | transformers-0.1.tar.gz

    总结来说,"transformers-0.1.tar.gz"是一个包含transformers库源码和相关资源的压缩包,通过这个包,用户可以深入了解并使用这个强大的Python库,从而在自然语言处理领域进行高效且先进的开发工作。无论你是NLP新手...

    基于PyTorch框架构建Transformers模型并应用于机器翻译任务项目python源码+项目使用说明.zip

    本项目是一个基于 PyTorch 框架构建 Transformers 模型并应用于翻译任务的项目,其中附带了详细的文档介绍 Transformers 模型在训练和推理中数据是如何变化的。 环境 * python 3.10 * torch 2.0.0 数据集 数据集...

    PyPI 官网下载 | pytorch-fast-transformers-0.1.2.tar.gz

    Fast-Transformers则通过优化计算策略,提高了Transformer模型的运行效率,降低了内存消耗,使得在有限硬件资源下可以处理更复杂的任务。 首先,Fast-Transformers的核心在于其精心设计的计算模式。它引入了分组...

    从自然语言生成 SQL:由 Transformers 架构提供支持的序列到序列模型 及协会规则.pdf

    本文所提出的模型结合了Seq2Seq框架和Transformers的优势,通过预训练的T5和mT5模型作为基础,实现了从自然语言到SQL的直接转换。具体来说,该模型首先使用编码器捕捉自然语言问题中的关键信息,然后利用解码器生成...

    Transformers库使用指南-Bert模型加载与操作详解

    内容概要:本文档主要介绍了如何在Python环境下使用Hugging Face Transformers库加载并应用BERT模型。具体包括了加载模型、获取指定隐藏层的表示以及如何从BERT获取最后的或所有层网络输出等关键操作流程。 适用人群...

    No module named ‘transformers.models.auto.tokenization-auto‘

    4. **离线资源**:在描述中提到的“gpt2分词器离线资源”可能是指在没有网络连接的情况下使用GPT-2 tokenizer。Hugging Face Transformers库允许用户下载模型和tokenizer的预训练权重,并在本地使用。要离线使用,...

    PyPI 官网下载 | transformers-4.7.0-py3-none-any.whl

    在实际开发中,使用`transformers-4.7.0-py3-none-any.whl`这样的wheel文件有诸多优势。首先,安装过程比普通的源代码安装更加快捷,因为它已经编译过,避免了编译时可能遇到的问题。其次,由于它是平台无关的,可以...

Global site tag (gtag.js) - Google Analytics