經常使用的hibernate查詢(hql) getHibernateTemplatesql
1、find(String queryString);數組
示例:this.getHibernateTemplate().find("from bean.User");緩存
返回全部User對象session
2、find(String queryString , Object value);app
示例:this.getHibernateTemplate().find("from bean.User u where u.name=?", "test");this
或模糊查詢:this.getHibernateTemplate().find("from bean.User u where u.name like ?", "%test%");編碼
返回name屬性值爲test的對象(模糊查詢,返回name屬性值包含test的對象)spa
3、find(String queryString, Object[] values);hibernate
示例:String hql= "from bean.User u where u.name=? and u.password=?"調試
this.getHibernateTemplate().find(hql, new String[]{"test", "123"});
返回用戶名爲test而且密碼爲123的全部User對象
4、findByExample(Object exampleEntity)
示例:
User u=new User();
u.setPassword("123" );//必須 符合的條件可是這兩個條件時並列的(象當於sql中的and)
u.setName("bb" );
list=this .getHibernateTemplate().findByExample(u,start,max);
返回:用戶名爲bb密碼爲123的對象
5、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開始計數)
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= "xiyue";
this .getHibernateTemplate().findByNamedParam(queryString, paramName, value);
System.out.println(list.get(0 ));
返回name爲xiyue的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[]{"xiyue", "123"};
this .getHibernateTemplate().findByNamedParam(queryString, paramName, value);
返回用戶名爲xiyue密碼爲123的User對象
8、findByNamedQuery(String queryName)
示例:
一、首先須要在User.hbm.xml中定義命名查詢
<hibernate-mapping>
<class>......</class>
<query name="queryAllUser "><!--此查詢被調用的名字-->
<![CDATA[
from bean.User
]]>
</query>
</hibernate-mapping>
二、以下使用查詢:
this .getHibernateTemplate().findByNamedQuery("queryAllUser ");
9、findByNamedQuery(String queryName, Object value)
示例:
一、首先須要在User.hbm.xml中定義命名查詢
<hibernate-mapping>
<class>......</class>
<query name="queryByName "><!--此查詢被調用的名字-->
<![CDATA[
from bean.User u where u.name = ?
]]>
</query>
</hibernate-mapping>
二、以下使用查詢:
this .getHibernateTemplate().findByNamedQuery("queryByName ", "test");
10、findByNamedQuery(String queryName, Object[] value)
示例:
一、首先須要在User.hbm.xml中定義命名查詢
<hibernate-mapping>
<class>......</class>
<query name="queryByNameAndPassword "><!--此查詢被調用的名字-->
<![CDATA[
from bean.User u where u.name =? and u.password =?
]]>
</query>
</hibernate-mapping>
二、以下使用查詢:
String[] values= new String[]{"test", "123"};
this .getHibernateTemplate().findByNamedQuery("queryByNameAndPassword " , values);
11、findByNamedQueryAndNamedParam(String queryName, String paramName, Object value)
示例:
一、首先須要在User.hbm.xml中定義命名查詢
<hibernate-mapping>
<class>......</class>
<query name="queryByName "><!--此查詢被調用的名字-->
<![CDATA[
from bean.User u where u.name =:myName
]]>
</query>
</hibernate-mapping>
二、以下使用查詢:
this .getHibernateTemplate().findByNamedQuery("queryByName " , "myName", "test");
12、findByNamedQueryAndNamedParam(String queryName, String[] paramName, Object[] value)
示例:
一、首先須要在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>
二、以下使用查詢:
String[] names= new String[]{"myName", "myPassword"};
String[] values= new String[]{"test", "123"};
this .getHibernateTemplate().findByNamedQuery("queryByNameAndPassword " , names, values);
十3、findByValueBean(String queryString , Object value);
示例:
一、定義一個ValueBean,屬性名必須和HSQL語句中的:後面的變量名同名,此處必須至少有兩個屬性,分別爲myName和myPassword,使用setter方法設置屬性值後
ValueBean valueBean= new ValueBean();
valueBean.setMyName("test");
valueBean.setMyPasswrod("123");
二、
String queryString= "from bean.User u where u.name=:myName and u.password=:myPassword";
this .getHibernateTemplate().findByValueBean(queryString , valueBean);
十4、findByNamedQueryAndValueBean(String queryName , Object value);
示例:
一、首先須要在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>
二、定義一個ValueBean,屬性名必須和User.hbm.xml命名查詢語句中的:後面的變量名同名,此處必須至少有兩個屬性,分別爲myName和myPassword,使用setter方法設置屬性值後
ValueBean valueBean= new ValueBean();
valueBean.setMyName("test");
valueBean.setMyPasswrod("123");
三、
String queryString= "from bean.User u where u.name=:myName and u.password=:myPassword";
this .getHibernateTemplate().findByNamedQueryAndValueBean("queryByNameAndPassword ", valueBean);
hibernatetemplate hibernate 使用 總結
使用HibernateTemplate的方法進行CRUD操做,其中查詢操做一般可分爲兩種,
一種爲固定條件查詢,
另外一種爲動態多條件查詢(如查詢界面的實現),固定條件查詢能夠很方便地經過createQuery,find()等方法實現,可是我在動態條件查詢的實現過程當中,hibernate0能夠實現英文的條件查詢,而中文條件則會出現亂碼。現將具體的過程描述以下:
固定條件查詢
可使用常規的方法,如
Java代碼
getHibernateTemplate().find(),getHibernateTemplate().createQuery()等
getHibernateTemplate().find(),getHibernateTemplate().createQuery()等
動態多條件查詢
因爲查詢條件的不肯定性,我曾嘗試用拼參數的方法將拼好的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()中也拼一次賦值。
如:
Java代碼
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) getHibernateTemplate().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) getHibernateTemplate().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();
}
});
}
以上方法能夠實現動態中文條件查詢,在有的書中看到並不推薦用find()方法,find()只提供一些簡單的HQL查詢,不具備動態綁定參數的功能,在未來的hibernate新版本中,有可能會淘汰find()方法,而Query接口才是真正的HQL查詢接口,提供更爲豐富的功能。基於此,可能對於一個將被淘汰的方法find()不支持中文也就不足爲奇了。^_^畢竟人家重心轉移了。並且find()中拼sql字符串的方式雖然是實現查詢的經常使用手段,實現起來也比較方便,可是不利於hibernate更好地利用緩存,而採用Query接口能夠更好地利用緩存,提升程序執行效率。
HibernateTemplate的經常使用方法簡介:
Java代碼
q void delete(Object entity):刪除指定持久化實例
q deleteAll(Collection entities):刪除集合內所有持久化類實例
q find(String queryString):根據HQL查詢字符串來返回實例集合
q findByNamedQuery(String queryName):根據命名查詢返回實例集合
q get(Class entityClass, Serializable id):根據主鍵加載特定持久化類的實例
q save(Object entity):保存新的實例
q saveOrUpdate(Object entity):根據實例狀態,選擇保存或者更新
q update(Object entity):更新實例的狀態,要求entity是持久狀態
q setMaxResults(int maxResults):設置分頁的大小
q void delete(Object entity):刪除指定持久化實例
q deleteAll(Collection entities):刪除集合內所有持久化類實例
q find(String queryString):根據HQL查詢字符串來返回實例集合
q findByNamedQuery(String queryName):根據命名查詢返回實例集合
q get(Class entityClass, Serializable id):根據主鍵加載特定持久化類的實例
q save(Object entity):保存新的實例
q saveOrUpdate(Object entity):根據實例狀態,選擇保存或者更新
q update(Object entity):更新實例的狀態,要求entity是持久狀態
q setMaxResults(int maxResults):設置分頁的大小
下面是一個完整DAO類的源代碼:
Java代碼
public class PersonDAOHibernate implements PersonDAO { //採用log4j來完成調試時的日誌功能 private static Log log = LogFactory.getLog(NewsDAOHibernate.class); //以私有的成員變量來保存SessionFactory。 private SessionFactory sessionFactory; //以私有變量的方式保存HibernateTemplate private HibernateTemplate hibernateTemplate = null; //設值注入SessionFactory必需的setter方法 public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } //初始化本DAO所需的HibernateTemplate public HIbernateTemplate getHibernateTemplate() { //首先,檢查原來的hibernateTemplate實例是否還存在 if ( hibernateTemplate == null) { //若是不存在,新建一個HibernateTemplate實例 hibernateTemplate = new HibernateTemplate(sessionFactory); } return hibernateTemplate; } //返回所有的人的實例 public List getPersons() { //經過HibernateTemplate的find方法返回Person的所有實例 return getHibernateTemplate().find("from Person"); } /** * 根據主鍵返回特定實例 * @ return 特定主鍵對應的Person實例 * @ param 主鍵值 public News getNews(int personid) { return (Person)getHibernateTemplate().get(Person.class, new Integer(personid)); } /** * @ person 須要保存的Person實例 */ public void savePerson(Person person) { getHibernateTemplate().saveOrUpdate(person); } /** * @ param personid 須要刪除Person實例的主鍵 * / public void removePerson(int personid) { //先加載特定實例 Object p = getHibernateTemplate().load(Person.class, new Integer(personid)); //刪除特定實例 getHibernateTemplate().delete(p); } }