• HibernateTemplate常用方法


    HibernateTemplate常用方法

    (本文章内容相当于转载自:http://www.tuicool.com/articles/fU7FV3,只是整理了一下内容结构和修改了部分内容,方便阅读)

    一、获取HibernateTemplate对象

    HibernateTemplate hibernateTemplate=HibernateTemplate() ;   //当然还有很多种其他的获取方式

    下面的例子都是用hibernateTemplate对象

    二、HibernateTemplate常用方法

    1、find(String queryString);  

    示例:hibernateTemplate.find("from bean.User");        

    返回所有User对象  

    2、find(String queryString , Object value);  

    示例:hibernateTemplate.find("from bean.User u where u.name=?", "test");  

    或模糊查询:hibernateTemplate.find("from bean.User u where u.name like ?", "%test%");  

    返回name属性值为test的对象(模糊查询,返回name属性值包含test的对象)

    3、find(String queryString, Object[] values);   

    示例:String hql= "from bean.User u where u.name=? and u.password=?";                 

         hibernateTemplate.find(hql, new String[]{"test", "123"});  

    返回用户名为test并且密码为123的所有User对象

    4、findByExample(Object exampleEntity)

    示例:User u=new  User();      

         u.setPassword("123" );

         u.setName("bb" );      //必须符合的条件但是这两个条件时并列的(象当于sql中的and)                        

             list=hibernateTemplate.findByExample(u);    

    返回:用户名为bb密码为123的对象

    5、findByExample(Object exampleEntity, int firstResult, int  maxResults)

    示例:User u=new  User();      

         u.setPassword("123" );

            u.setName("bb" );      //必须 符合的条件但是这两个条件时并列的(象当于sql中的and)

         list=hibernateTemplate.findByExample(u,start,max);      

    返回:满足用户名为bb密码为123,自start起共max个User对象。(对象从0开始计数)

    6、findByNamedParam(String queryString , String paramName , Object value)  

    示例:String queryString = "select count(*) from bean.User u where u.name=:myName" ;  

       String paramName= "myName";

       String value= "abc";  

       list=hibernateTemplate.findByNamedParam(queryString, paramName, value);

       System.out.println(list.get(0 ));        

    返回:name为abc的User对象的条数

    7、 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[]{"abc", "123"};  

       hibernateTemplate.findByNamedParam(queryString, paramName, value); 

    返回:用户名为abc密码为123的User对象

    8、findByNamedQuery(String queryName)        

    示例:  

    1、首先需要在User.hbm.xml中定义命名查询               

    <hibernate-mapping>                    

    <class>......</class>  

    <query name="queryAllUser ">   <!--此查询被调用的名字-->  

    <![CDATA[  

    from bean.User

    ]]>

    </query>

    </hibernate-mapping>           

    2、如下使用查询:  

    hibernateTemplate.findByNamedQuery("queryAllUser "); 

    9、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、如下使用查询:  

    hibernateTemplate.findByNamedQuery("queryByName ", "test");

    10、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"};  

    hibernateTemplate.findByNamedQuery("queryByNameAndPassword " , values);  

    11、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、如下使用查询:  

    hibernateTemplate.findByNamedQuery("queryByName " , "myName", "test");

    12、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"};  

    hibernateTemplate.findByNamedQuery("queryByNameAndPassword " , names, values);

    13、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";  

    hibernateTemplate.findByValueBean(queryString , valueBean); 

    14、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";  

    hibernateTemplate.findByNamedQueryAndValueBean("queryByNameAndPassword ", valueBean);  

    三、hibernatetemplate hibernate 使用总结 

    使用HibernateTemplate的方法进行CRUD操作,其中查询操作通常可分为两种, 一种为固定条件查询,另一种为动态多条件查询(如查询界面的实现),固定条件查询可以很方便地通过createQuery,find()等方法实现,但是我在动态条件查询的实现过程中,hibernate0可以实现英文的条件查询,而中文条件则会出现乱码。现将具体的过程描述如下:       

    1、固定条件查询 

    可以使用常规的方法,如 Java代码 

    hibernateTemplate.find(),hibernateTemplate.createQuery()等   

    hibernateTemplate.find(),hibernateTemplate.createQuery()等

    2、动态多条件查询 

    由于查询条件的不确定性,我曾尝试用拼参数的方法将拼好的sql语句传入find(qlStr),但是查询时hibernate会将中文的条件报为乱码。 不过如果条件全部是英文参数的话拼sql是可以的。

    乱码报错如下: 

    3:49,946 INFO  [STDOUT] Hibernate: 

    select incometype0_.id as id, incometype0_.name as name0_,incometype0_.type_comment as type3_0_ from income_type incometype0_ where 1=1 and incometype0_.type_comment='·á????×?????' 

    因此这种方法无法使用。另外find()的另一种find(String arg0,Object[] arg1),采用数组参数将sql的条件参数传入的方式只是适合固定条件参数的查询,不适合这种动态多条件的中文查询,因此也无法使用。  

    说明:由于find(String arg0,Object[] arg1)采用数组参数的方式可以使用中文条件查询,因此可以确定不是我的编码问题。而是Hibernate0的find(sqlStr)方法本身的问 题。 

    为此只能换成另一种实现途径,如下: 

    • 得到session
    • 用Query q = session.createQuery(sql);该方法返回一个Query 类型
    • 利用q.setString(String arg0,String arg1)将参数赋值给sql的参数条件。
    • 在sql语句中拼一次参数,在setString()中也拼一次赋值。 如:
    public List phraseQuery(final String id, final String name, final String typecomment) {
            StringBuffer sql = new StringBuffer();
            sql.append("from IncomeType where 1=1 ");
            if (id != null && id.length() > 0)
                sql.append(" and id = :id ");
            if (name != null && name.length() > 0)
                sql.append(" and name = :name ");
            if (typecomment != null && typecomment.length() > 0)
                sql.append(" and typeComment = :tc ");
            final String typeSql = new String(sql);
            return (List) hibernateTemplate.execute(new HibernateCallback() {
                public Object doInHibernate(Session session) throws HibernateException, SQLException {
                    Query q = session.createQuery(typeSql);
                    if (id != null && id.length() > 0)
                        q.setString("id", id);
                    if (name != null && name.length() > 0)
                        q.setString("name", name);
                    if (typecomment != null && typecomment.length() > 0)
                        q.setString("tc", typecomment);
                    return q.list();
                }
            });
        }
    
        public List phraseQuery(final String id, final String name, final String typecomment) {
            StringBuffer sql = new StringBuffer();
            sql.append("from IncomeType where 1=1 ");
            if (id != null && id.length() > 0)
                sql.append(" and id = :id ");
            if (name != null && name.length() > 0)
                sql.append(" and name = :name ");
            if (typecomment != null && typecomment.length() > 0)
                sql.append(" and typeComment = :tc ");
            final String typeSql = new String(sql);
            return (List) hibernateTemplate.execute(new HibernateCallback() {
                public Object doInHibernate(Session session) throws HibernateException, SQLException {
                    Query q = session.createQuery(typeSql);
                    if (id != null && id.length() > 0)
                        q.setString("id", id);
                    if (name != null && name.length() > 0)
                        q.setString("name", name);
                    if (typecomment != null && typecomment.length() > 0)
                        q.setString("tc", typecomment);
                    return q.list();
                }
            });
        }

    22:43:09

    2018-12-24

  • 相关阅读:
    CentOS7 安装 ElasticSearch7
    非易失性规划的原理与实现方法
    CV Recognition: From AlexNet To Inceptionv4
    有趣的Cache创新@HotChips'33
    计算架构的演进
    集合通信行为分析 基于NCCL
    Performance Scaling Laws
    单机互联拓扑获取 软件方式
    Operator Numerical Check
    论文笔记 — Learning to Collaborate: MultiScenario Ranking via MultiAgent Reinforcement Learning
  • 原文地址:https://www.cnblogs.com/chiweiming/p/10171454.html
Copyright © 2020-2023  润新知