对原生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}.name, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id ").addEntity("cat", Cat.class).addJoin("kitten", "cat.kittens").list();
还可以这样:
s.createSQLQuery("select * from tbl_user2 um").addEntity("um",UserModel.class);
原生的SQL按条件查询可以返回多个属性,形成Object[]
它将返回一个Object[]组成的List,Hibernate会使用ResultSetMetadata来判定返回的标量值的实际顺序和类型。你也可以使用scalar来明确指明类型
List rs = session.createSQLQuery("select * from TAB_ORDER t where t.id=1")
.addScalar("money", LongType.INSTANCE).list();
//这里得到的是一个Long类型的List,而且是数据库中money这一列的值。
System.out.println(rs.get(0));
Session session = HibernateSessionFactoryUtil.getSessionFactory()
.getCurrentSession();
session.beginTransaction();
Query q = session.createSQLQuery("select * from TAB_ORDER")
.addScalar("id", LongType.INSTANCE)
.addScalar("money", DoubleType.INSTANCE)
.addScalar("orderno", StringType.INSTANCE)
.addScalar("customerid", LongType.INSTANCE);
List list = q.list();
for (int i = 0; i < list.size(); i++) {
//这里要用Object[]接收查出来的list中每一条数据
Object[] obj = (Object[]) list.get(i);
System.out.println(obj[0] + " * " + obj[1] + " * " + obj[2] + " * " + obj[3]);
}
session.getTransaction().commit();
命名SQL查询(不常用)
可以在映射文档中定义查询的名字,然后就可以象调用一个命名的HQL查询一样直接调用命名SQL查询.在这种情况下,就不需要调用addEntity()方法,但是这种方法不常用,所以这里也不赘述了。
分享到:
相关推荐
Hibernate SQLQuery 查询Oracle char类型结果为一个字符解决方法 Hibernate SQLQuery 查询Oracle char类型结果为一个字符解决方法 Hibernate SQLQuery 查询Oracle char类型结果为一个字符解决方法 Hibernate SQL...
Hibernate+本地SQL查询SQLQuery宣贯.pdf
Hibernate+本地SQL查询SQLQuery.pdf
NULL 博文链接:https://mlxnle.iteye.com/blog/1766676
我们能够很方便的创建一个SQLQuery(SQLQuery是一个接口,在Hibernate4.2.2之前,默认返回的是SQLQuery的实现类——SQLQueryImpl对象,在下文中出现的SQLQuery如非注明,都是指该子类)对象来进行原生SQL查询:。...
使用本地sql语句查询后,无需再使用Object对查询结果进行强制转换,而是直接将查询结果放到实体Bean里了。 PS: 其实只有一版,这里只所以叫最终版是因为该附件我上传了好几天传不上去,到最后报告说‘资源已经存在...
hibernate sql hqlsql
二、Hibernate可以使用Query.setMaxResults方法简单地设置需要查询的最大结果集。 然后Hibernate会自动根据所设置的数据库方言翻译成相应的SQL语句提交给数据库。比如如果数据库是Oracle,SQL Server等,则翻译为...
Hibernate中使用Criteria Query各种QBC查询
如果希望通过编程的方式创建查询,Hibernate提供了完善的按条件(Query By Criteria, QBC)以及按样例(Query By Example, QBE)进行Hibernate查询的功能。 你也可以用原生SQL(native SQL)描述Hibernate查询,Hibernate...
上传的资料都是非常经典的,这也是我学习过程中的心得,希望大家能给我指点,也希望大家多上传资料共同学习。千万不要传空文件夹。。。那些人很可恶啊
源码 博文链接:https://raymondhekk.iteye.com/blog/250427
HQL(Hibernate Query Language):是面向对象的查询语句,它的语法和SQL语句有些相像,在运行时才得以解析.HQL并不像SQL那样是.
Hibernate使用中防止SQL注入的几种方案 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 在获取便利操作的同时...
[Hibernate体系结构的概要图] Hibernate体系结构的概要图 Hibernate的核心接口一共有6个,分别为:Session、SessionFactory... Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式
HQL is database independent and translated into SQL by Hibernate at runtime. When writing HQL, we can concentrate on the objects and properties without knowing much detail on the underlying database. ...
使用Query对象可以方便的查询数据库中的数据,它主要使用HQL或者本地SQL查询数据。Query对象不仅能查询数据,还可以绑定参数、限制查询记录数量、实现批量删除和批量更新等。 Configuration cfg=new Configuration()...
SessionFactory接口 SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。... Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式