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
  1. 如果使用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();
  1. 使用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();
  1. 使用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;

  1. 解决问题:

把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/

时间: 2024-07-31 14:31:27

getHibernateTemplate.find()和session.createQuery()方法总结的相关文章

herbnate session.createSQLQuery(sql) 和 session.createQuery(sql)使用

public class DistributeDao implements Serializable{ private SessionFactory sessionFactory; public Session getSession() { return sessionFactory.getCurrentSession(); } public SessionFactory getSessionFactory() { return sessionFactory; } public void set

session.createQuery()与createSQLQuery()区别【转】

原文出处:http://blog.csdn.net/zdwzzu2006/article/details/6863660 createQuery与createSQLQuery两者区别是: 前者用的hql语句进行查询,后者可以用sql语句查询 前者以hibernate生成的Bean为对象装入list返回 后者则是以对象数组进行存储 所以使用createSQLQuery有时候也想以hibernate生成的Bean为对象装入list返回,就不是很方便 突然发现createSQLQuery有这样一个方法

清空session的方法

清空session的方法,常用来注销的时候清空所有的session. 方法一: Enumeration e=session.getAttributeNames(); while(e.hasMoreElements()){ String sessionName=(String)e.nextElement(); System.out.println("存在的session有:"+sessionName); session.removeAttribute(sessionName); } 方法

第二节 hibernate session基本方法介绍

Hibernate session 对象是和数据库建立连接的对象,session中包含了许多操作数据库的方法,下面一一描述. 1 保存对象到数据库 session.save(); 按照第一节的配置,主键的生成策略为native(数据库自动生成主键),由于数据库使用的是mysql 5,所以是自增的主键生成方式.保存对象时并不需要设置id属性. @Test public void testSave() { try { User user = new User(); user.setBirthday(

【翻译自mos文章】找到持有library cache lock session的方法

找到持有library cache lock session的方法 参考自: How to Find which Session is Holding a Particular Library Cache Lock (文档 ID 122793.1) 其实就是两种方法: 一.Systemstate Analysis 此处不做翻译,原文转载 Systemstate event will create a tracefile containing detailed information on eve

asp.net网站防恶意刷新的Cookies与Session解决方法

本文实例讲述了asp.net网站防恶意刷新的Cookies与Session解决方法,是WEB程序设计中非常实用的技巧.分享给大家供大家参考.具体实现方法如下: Session版实现方法: public double time; public const int freetime = 1;//防刷冰冻时间间隔,当前为1秒 #region 防恶意刷新 if (Session.SessionID == null) {   Response.End(); } else if (Session["sion

ASP.NET ASHX中获得Session的方法

1-在 aspx和aspx.cs中,都是以Session["xxx"]="aaa"和aaa=Session["xxx"].ToString()进行读写. 而在ashx中,Session都要使用context.Session,读写方法是这样的: context.Session["xxx"]="aaa"和aaa=context.Session["xxx"].ToString() 2-在ash

【JAVA学习】struts2的action中使用session的方法

尊重版权:http://hi.baidu.com/dillisbest/item/0bdc35c0b477b853ad00efac 在Struts2里,如果需要在Action中使用session,可以通过下面两种方式得到1.通过ActionContext class中的方法getSession得到2.Action实现org.apache.struts2.interceptor.SessionAware接口的方式来对session进行操作 下面先看一个采用第一种方式,在action中得到sessi

session.createQuery()不执行和java.lang.reflect.InvocationTargetException

今天写SSH的工程的时候,执行到一个DAO中的Query query = session.createQuery(hql)的时候,没有成功执行,直接跳到了finally,然后前台报了500和java.lang.reflect.InvocationTargetException的错误. 代码如下: package dao; import java.util.List; import model.AccountInfo; import org.hibernate.HibernateException