【Hibernate】getHibernateTemplate.find()和session.createQuery()方法总结
Spring中常用的hql查询方法(getHibernateTemplate().find())
一、find(String queryString);
示例:this.getHibernateTemplate().find("from bean.User"); 返回所有User对象
二、find(String queryString , Object value);
示例:this.getHibernateTemplate().find("from bean.User u where u.name=?", "test"); 或模糊查询:this.getHibernateTemplate().find("from bean.User u where u.name like ?", "%test%"); 返回name属性值为test的对象(模糊查询,返回name属性值包含test的对象)
三、find(String queryString, Object[] values);
示例:String hql= "from bean.User u where u.name=? and u.password=?" this.getHibernateTemplate().find(hql, new String[]{"test", "123"}); 返回用户名为test并且密码为123的所有User对象 u.setName("bb"); list=this.getHibernateTemplate().findByExample(u,start,max); 返回:用户名为bb密码为123的对象
---------------------------------
四、findByExample(Object exampleEntity)
示例: User u=new User(); u.setPassword("123");//必须 符合的条件但是这两个条件时并列的(象当于sql中的and) u.setName("bb"); list=this.getHibernateTemplate().findByExample(u,start,max); 返回:用户名为bb密码为123的对象
五、findByExample(Object exampleEntity, int firstResult, int maxResults)
示例: User u=new User(); u.setPassword("123");//必须 符合的条件但是这两个条件时并列的(象当于sql中的and) u.setName("bb"); list=this.getHibernateTemplate().findByExample(u,start,max); 返回:满足用户名为bb密码为123,自start起共max个User对象。(对象从0开始计数)
六、findByNamedParam(String queryString , String paramName , Object value)
使用以下语句查询:
String queryString = "select count(*) from bean.User u where u.name=:myName"; String paramName= "myName"; String value= "xiyue"; this.getHibernateTemplate().findByNamedParam(queryString, paramName, value); System.out.println(list.get(0)); 返回name为xiyue的User对象的条数
七、findByNamedParam(String queryString , String[] paramName , Object[] value)
示例: String queryString = "select count(*) from bean.User u where u.name=:myName and u.password=:myPassword"; String[] paramName= new String[]{"myName", "myPassword"}; String[] value= new String[]{"xiyue", "123"}; this.getHibernateTemplate().findByNamedParam(queryString, paramName, value); 返回用户名为xiyue密码为123的User对象
八、findByNamedQuery(String queryName)
示例: 1、首先需要在User.hbm.xml中定义命名查询 <hibernate-mapping> <class>......</class> <query name="queryAllUser"><!--此查询被调用的名字--> <![CDATA[ from bean.User ]]> </query> </hibernate-mapping> 2、如下使用查询: this.getHibernateTemplate().findByNamedQuery("queryAllUser");
九、findByNamedQuery(String queryName, Object value)
示例: 1、首先需要在User.hbm.xml中定义命名查询 <hibernate-mapping> <class>......</class> <query name="queryByName"><!--此查询被调用的名字--> <![CDATA[ from bean.User u where u.name = ? ]]> </query> </hibernate-mapping> 2、如下使用查询: this.getHibernateTemplate().findByNamedQuery("queryByName", "test");
十、findByNamedQuery(String queryName, Object[] value)
示例: 1、首先需要在User.hbm.xml中定义命名查询 <hibernate-mapping> <class>......</class> <query name="queryByNameAndPassword"><!--此查询被调用的名字--> <![CDATA[ from bean.User u where u.name =? and u.password =? ]]> </query> </hibernate-mapping> 2、如下使用查询: String[] values= new String[]{"test", "123"}; this.getHibernateTemplate().findByNamedQuery("queryByNameAndPassword" , values);
十一、findByNamedQueryAndNamedParam(String queryName, String paramName, Object value)
示例:
1、首先需要在User.hbm.xml中定义命名查询 <hibernate-mapping> <class>......</class> <query name="queryByName"><!--此查询被调用的名字--> <![CDATA[ from bean.User u where u.name =:myName ]]> </query> </hibernate-mapping> 2、如下使用查询: this.getHibernateTemplate().findByNamedQuery("queryByName" , "myName", "test");
十二、findByNamedQueryAndNamedParam(String queryName, String[] paramName, Object[] value)
示例:
1、首先需要在User.hbm.xml中定义命名查询 <hibernate-mapping> <class>......</class> <query name="queryByNameAndPassword"><!--此查询被调用的名字--> <![CDATA[ from bean.User u where u.name =:myName and u.password=:myPassword ]]> </query> </hibernate-mapping> 2、如下使用查询: String[] names= new String[]{"myName", "myPassword"}; String[] values= new String[]{"test", "123"}; this.getHibernateTemplate().findByNamedQuery("queryByNameAndPassword" , names, values);
十三、findByValueBean(String queryString , Object value);
示例:
1、定义一个ValueBean,属性名必须和HSQL语句中的:后面的变量名同名,此处必须至少有两个属性,分别为myName和myPassword,使用setter方法设置属性值后 ValueBean valueBean= new ValueBean(); valueBean.setMyName("test"); valueBean.setMyPasswrod("123"); 2、 String queryString= "from bean.User u where u.name=:myName and u.password=:myPassword"; this.getHibernateTemplate().findByValueBean(queryString , valueBean);
十四、findByNamedQueryAndValueBean(String queryName , Object value);
示例:
1、首先需要在User.hbm.xml中定义命名查询 <hibernate-mapping> <class>......</class> <query name="queryByNameAndPassword"><!--此查询被调用的名字--> <![CDATA[ from bean.User u where u.name =:myName and u.password=:myPassword ]]> </query> </hibernate-mapping> 2、定义一个ValueBean,属性名必须和User.hbm.xml命名查询语句中的:后面的变量名同名,此处必须至少有两个属性,分别为myName和myPassword,使用setter方法设置属性值后 ValueBean valueBean= new ValueBean(); valueBean.setMyName("test"); valueBean.setMyPasswrod("123"); 3、 String queryString= "from bean.User u where u.name=:myName and u.password=:myPassword"; this.getHibernateTemplate().findByNamedQueryAndValueBean("queryByNameAndPassword", valueBean);
session的createQuery()方法总结
使用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();
原来的查询语句:
String sql = "select a.* from tb_doc_catalog a where a.cat_code like '"+catCode+"%'";
Session session = this.getSession();
try {List catNameList = session.createSQLQuery(sql).list();return catNameList ;
} finally {releaseSession(session); //释放session
}
分析:原来是查询出来的字段并不能自动转换为bean对象。
解决思路一(采用hql查询):
String sql = "select a from DocCatalogInfo a where a.catCode like '"+catCode+"%'";
List catNameList =getHibernateTemplate().find(sql);
return catNameList ;
测试一下发现没问题,看来还是因为用原生sql查询的原因,网上搜一下:createsqlQuery返回对象,看到一篇文章才觉悟到:
解决思路二(采用原生sql查询):
String sql = "select a.* from tb_doc_catalog a where a.cat_code like '"+catCode+"%'";
Session session = this.getSession();
try {List catNameList = session.createSQLQuery(sql).addEntity(DocCatalogInfo.class).list();return catNameList ;
} finally {releaseSession(session); //释放session
}
下面我们来总结一下hibernate 中createQuery与createSQLQuery两者区别:
1、前者用的hql语句进行查询,后者可以用sql语句查询。
2、前者以hibernate生成的Bean为对象装入list返回,后者则是以对象数组进行存储。
所以使用createSQLQuery有时候也想以hibernate生成的Bean为对象装入list返回,就不是很方便。
突然发现createSQLQuery有这样一个方法可以直接转换对象:
Query query = session.createSQLQuery(sql).addEntity(XXXXXXX.class);
XXXXXXX 代表以hibernate生成的Bean的对象,也就是数据表映射出的Bean。
以后多注意,还是时不时的要看看hibernate各个对象方法的使用。
还有另外一个相关的小细节应注意:
比如有这样一个po
PO: User.class
properties: userId,userName
DDL: create table tuser (userid varchar(10),username varchar(20));
当执行:session.createQuery(“from User u”).list()时生成的SQL:select userid,username from tuser;
当执行:session.createQuery(“from User u”).iterator()时生成的SQL:select userid from tuser;
可以看出list()一次将数据从数据库中读出直接填充到List中,iterator()将数据的主键从数据库中读出,当循环这个Iterator时才添加执行:
select userid,username from user where userid=?;把数据读出。
在不同的应用范围使用不同的方法,具体在hibernate应用中应当注意。
用法一(返回数值):
ISQLQuery query = session.CreateSQLQuery("SELECT COUNT(Id) AS C FROM Cake").AddScalar("C", NHibernateUtil.Int32);
int c = Convert.ToInt32(query.UniqueResult());
或int c = query.UniqueResult<int>;//使用此方法发现sql执行了两次,故不推荐使用。
用法二(返回对象实体):
ISQLQuery query = session.CreateSQLQuery("select * from cake c").AddEntity("CAKE.DataTransfer.Entities.Cake");
或ISQLQuery query = session.CreateSQLQuery("select * from cake c").AddEntity("c", "CAKE.DataTransfer.Entities.Cake");
或ISQLQuery query = session.CreateSQLQuery("select * from cake c").AddEntity(typeof(Cake));
或ISQLQuery query = session.CreateSQLQuery("select * from cake c").AddEntity("c", typeof(Cake));
或ISQLQuery query = session.CreateSQLQuery("select * from cake c").AddEntity("c", typeof(Cake), LockMode.Write);IList<Cake> c = query.List<Cake>();
用法三(连表查询):
ISQLQuery query = session.CreateSQLQuery("select cs.* from cake c join CakeSize cs on cs.CakeId=c.Id").AddEntity("cs", typeof(CakeSize));
IList<CakeSize> cs = query.List<CakeSize>();
以上是一种常见的用法,通过该例子,相信大家心里也已经有个数了,也应该知道怎么操作这个sql了:
但是过程中难免会遇到些问题,比如:
实例二(问题说明):
我需要执行例如这条sql语句:
select CreateTime,Address,Password, (case when EmailType = 0 then 'Gmail' when EmailType = 1 then 'Yahoo' when EmailType = 2 then 'Hotmail' else 'Other' end) as EmailType from MailInfo
- 如果使用session.CreateQuery方法执行的话,你可能会遇到这样的错误:
错误:undefined alias or unknown mapping
ISession session = DAORepository.Instrance.DbSession;
string queryString = "select CreateTime,Address,Password, (case when EmailType = 0 then 'Gmail' when EmailType = 1 then 'Yahoo' when EmailType = 2 then 'Hotmail' else 'Other' end) as EmailType from MailInfo where status=0 Order by CreateTime desc";
IQuery query = session.CreateQuery(queryString;
IList lst = query.List();
- 使用CreateSQLQuery方法执行:
错误:Return types of SQL query were not specified…
ISession session = DAORepository.Instrance.DbSession;
string queryString = "select CreateTime,Address,Password, (case when EmailType = 0 then 'Gmail' when EmailType = 1 then 'Yahoo' when EmailType = 2 then 'Hotmail' else 'Other' end) as EmailType from MailInfo where status=0 Order by CreateTime desc";
ISQLQuery query = session.CreateSQLQuery(queryString);
IList lst = query.List();
- 使用CreateSQLQuery方法并指定返回字段值的类型,即使用AddScalar方法指定字段值类型:
错误:could not execute query…
ISession session = DAORepository.Instrance.DbSession;
string queryString = "select CreateTime,Address,Password, (case when EmailType = 0 then 'Gmail' when EmailType = 1 then 'Yahoo' when EmailType = 2 then 'Hotmail' else 'Other' end) as EmailType from MailInfo where status=0 Order by CreateTime desc";
ISQLQuery query = session.CreateSQLQuery(queryString).AddScalar("CreateTime",NHibernateUtil.String)
.AddScalar("Address",NHibernateUtil.String)
.AddScalar("Password",NHibernateUtil.String)
.AddScalar("EmailType",NHibernateUtil.Int32);
IList lst = query.List();
ISession session = DAORepository.Instrance.DbSession;
string queryString = "select CreateTime,Address,Password, (case when EmailType = 0 then 'Gmail' when EmailType = 1 then 'Yahoo' when EmailType = 2 then 'Hotmail' else 'Other' end) as EmailType from MailInfo where status=0 Order by CreateTime desc";
ISQLQuery query = session.CreateSQLQuery(queryString)
.AddScalar("CreateTime",NHibernateUtil.String)
.AddScalar("Address",NHibernateUtil.String)
.AddScalar("Password",NHibernateUtil.String)
.AddScalar("EmailType",NHibernateUtil.Int32);
IList lst = query.List();
注意:EmailType字段对应数据库的类型是int,这里我就误解为也应该映射为NHibernateUtil.Int32;
- 解决问题:
把AddScalar方法的参数里一个属性改了一下:
ISession session = DAORepository.Instrance.DbSession;
string queryString = "select CreateTime,Address,Password, (case when EmailType = 0 then 'Gmail' when EmailType = 1 then 'Yahoo' when EmailType = 2 then 'Hotmail' else 'Other' end) as EmailType from MailInfo where status=0 Order by CreateTime desc";
ISQLQuery query = session.CreateSQLQuery(queryString).AddScalar("CreateTime",NHibernateUtil.String)
.AddScalar("Address",NHibernateUtil.String)
.AddScalar("Password",NHibernateUtil.String)
.AddScalar("EmailType",NHibernateUtil.String);
IList lst = query.List();
ISession session = DAORepository.Instrance.DbSession;
string queryString = "select CreateTime,Address,Password, (case when EmailType = 0 then 'Gmail' when EmailType = 1 then 'Yahoo' when EmailType = 2 then 'Hotmail' else 'Other' end) as EmailType from MailInfo where status=0 Order by CreateTime desc";
ISQLQuery query = session.CreateSQLQuery(queryString)
.AddScalar("CreateTime",NHibernateUtil.String)
.AddScalar("Address",NHibernateUtil.String)
.AddScalar("Password",NHibernateUtil.String)
.AddScalar("EmailType",NHibernateUtil.String);
IList lst = query.List();
推荐一个hibernate源码在线查看网站:
http://www.boyunjian.com/javasrc/org.hibernate/hibernate-core/
【Hibernate】getHibernateTemplate.find()和session.createQuery()方法总结相关推荐
- hibernate中session接口方法总结
Session的save()和persist()方法 Session的save()方法使一个临时对象转变为持久化对象.它完成以下操作: (1)将临时对象加入到Session缓存中,使其进入持久化状态. ...
- Hibernate事务管理-HibernateTransactionManager-对hibernate session的管理
由于对SSH还停留在比较初级的应用水平上,今天在遇到一个疑惑时折腾了很久,具体问题是这样的, 有这么一个测试方法, 1 public static void test1() { 2 Applicati ...
- hql Hibernate.gethibernatetemplate()
1. find(String hql); //普通查询 示例:this.gethibernateTemplate().find("from User"); 2. find(Str ...
- [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定...
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- hibernate中get方法和load方法的根本区别
hibernate中get方法和load方法的根本区别 如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用,它可以放心的使用代理来 ...
- Hibernate的evict方法和clear方法的区别
摘自百度知道:http://zhidao.baidu.com/question/63663640.html 问: 先创建一个Student,然后调用session.save方法,然后再调用evict方 ...
- Hibernate之Query接口的uniqueResult 方法
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 如果查询 ...
- No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer解决方法
No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer解决方法 参考文章: ...
- 使用无限生命期Session的方法
使用无限生命期Session的方法 [来源] 达内 [编辑] 达内 [时间]2013-03-28 Session储存在服务器端,根据客户端提供的SessionID来得到这个用户的文件,然后读 ...
最新文章
- LeetCode算法题12:递归和回溯-字符串中的回溯问题
- 从博客时间轴总结这一年
- 【Python基础入门系列】第04天:Python 流程控制
- LeetCode 1133. 最大唯一数
- html中的异步请求数据格式,解决layui中table异步数据请求不支持自定义返回数据格式的问题...
- 30岁程序员吐槽:一分钟只能赚3.3元,混得太差!算出月薪后我服了
- Android开发技术周报 Issue#70++
- 23 SD配置-主数据-定义销售地区
- LA 2957 最大流,最短时间,输出路径
- Spark入门(Python版)
- 数据结构学习(一)数组
- spring系统学习:day4--Spring工厂
- 浅谈 iOS设计之多视图—模态视图的基本操作
- 2019美赛B题完整论文
- Inverting the Generator of a GAN 生成器反向
- 三做一年级算术题-吐槽挖雷
- 关于RS-485总线,这篇很详细
- Swift版百思不得姐
- 程序员月薪过7万,可以落户北京了
- 计算机存储单元ASCI,在计算机存储器中,存储英文字母\quot;A\quot;时,存储的是它的( ) A.输入码B.ASCII码C - 作业在线问答...
热门文章
- Ajax搜索结果页面下方的分页按钮的生成
- Android Activity为什么要细化出onCreate、onStart、onResume、onPause、onStop、onDesdroy这么多方法让应用去重载?
- overridePendingTransition
- android studio如何生成混淆代码的jar
- 【android】静态链接器/加载器(ld) 动态加载器(/system/bin/linker)+动态加载接口(dlopen)
- Java并发编程—锁的基本概念
- 性能测试工具—JMeter分布式启动
- css设置不允许复制文本内容
- 第二章节 怀疑的练习和不会的练习
- 2、django管理网站