(本文章内容相当于转载自:http://www./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)方法本身的问 题。 为此只能换成另一种实现途径,如下:
1 public List phraseQuery(final String id, final String name, final String typecomment) { 2 StringBuffer sql = new StringBuffer(); 3 sql.append("from IncomeType where 1=1 "); 4 if (id != null && id.length() > 0) 5 sql.append(" and id = :id "); 6 if (name != null && name.length() > 0) 7 sql.append(" and name = :name "); 8 if (typecomment != null && typecomment.length() > 0) 9 sql.append(" and typeComment = :tc "); 10 final String typeSql = new String(sql); 11 return (List) hibernateTemplate.execute(new HibernateCallback() { 12 public Object doInHibernate(Session session) throws HibernateException, SQLException { 13 Query q = session.createQuery(typeSql); 14 if (id != null && id.length() > 0) 15 q.setString("id", id); 16 if (name != null && name.length() > 0) 17 q.setString("name", name); 18 if (typecomment != null && typecomment.length() > 0) 19 q.setString("tc", typecomment); 20 return q.list(); 21 } 22 }); 23 } 24 25 public List phraseQuery(final String id, final String name, final String typecomment) { 26 StringBuffer sql = new StringBuffer(); 27 sql.append("from IncomeType where 1=1 "); 28 if (id != null && id.length() > 0) 29 sql.append(" and id = :id "); 30 if (name != null && name.length() > 0) 31 sql.append(" and name = :name "); 32 if (typecomment != null && typecomment.length() > 0) 33 sql.append(" and typeComment = :tc "); 34 final String typeSql = new String(sql); 35 return (List) hibernateTemplate.execute(new HibernateCallback() { 36 public Object doInHibernate(Session session) throws HibernateException, SQLException { 37 Query q = session.createQuery(typeSql); 38 if (id != null && id.length() > 0) 39 q.setString("id", id); 40 if (name != null && name.length() > 0) 41 q.setString("name", name); 42 if (typecomment != null && typecomment.length() > 0) 43 q.setString("tc", typecomment); 44 return q.list(); 45 } 46 }); 47 } |
|
来自: 栲栗 > 《hibernatetemplate的常用用法》