A. 各位大俠們,hibernate怎麼完成動態生成sql語句的啊
Hibernate3支持DetachedCriteria,這是一個非常有意義的特性!我們知道,在常規的Web編程中,有大量的動態條件查詢,即用戶在網頁上面自由選擇某些條件,程序根據用戶的選擇條件,動態生成SQL語句,進行查詢。針對這種需求,對於分層應用程序來說,Web層需要傳遞一個查詢的條件列表給業務層對象,業務層對象獲得這個條件列表之後,然後依次取出條件,構造查詢語句。這里的一個難點是條件列表用什麼來構造?傳統上使用Map,但是這種方式缺陷很大,Map可以傳遞的信息非常有限,只能傳遞name和value,無法傳遞究竟要做怎樣的條件運算,究竟是大於,小於,like,還是其它的什麼,業務層對象必須確切掌握每條entry的隱含條件。因此一旦隱含條件改變,業務層對象的查詢構造演算法必須相應修改,但是這種查詢條件的改變是隱式約定的,而不是程序代碼約束的,因此非常容易出錯。DetachedCriteria可以解決這個問題,即在web層,程序員使用DetachedCriteria來構造查詢條件,然後將這個DetachedCriteria作為方法調用參數傳遞給業務層對象。而業務層對象獲得DetachedCriteria之後,可以在session范圍內直接構造Criteria,進行查詢。就此,查詢語句的構造完全被搬離到web層實現,而業務層則只負責完成持久化和查詢的封裝即可,與查詢條件構造完全解耦,非常完美!這恐怕也是以前很多企圖在web層代碼中構造HQL語句的人想實現的夢想吧!示例代碼片段如下:web層程序構造查詢條件:java代碼:DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class);
detachedCriteria.add(Restrictions.eq("name", "department")).createAlias("employees", "e").add(Restrictions.gt(("e.age"), new Integer(20)));Department和Employee是一對多關聯,查詢條件為:名稱是「department」開發部門;
部門裡面的雇員年齡大於20歲;業務層對象使用該條件執行查詢:java代碼:detachedCriteria.getExecutableCriteria(session).list();最大的意義在於,業務層代碼是固定不變的,所有查詢條件的構造都在web層完成,業務層只負責在session內執行之。這樣代碼就可放之四海而皆準,都無須修改了。然而Spring和Hibernate3的DetachedCriteria有不兼容的問題,因此在Spring環境下面使用Hibernate3需要注意:Spring的HibernateTemplate提供了Hibernate的完美封裝,即通過匿名類實現回調,來保證Session的自動資源管理和事務的管理。其中核心方法是:java代碼:HibernateTemplate.execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
....
}
}回調方法提供了session作為參數,有了session,就可以自由的使用Hibernate API編程了。使用了spring的之後,代碼修改如下:web層代碼:java代碼:DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class);
detachedCriteria.createAlias("employees", "e").add(Restrictions.eq("name", "department")).add(Restrictions.gt(("e.age"), new Integer(20)));
departmentManager.findByCriteria(detachedCriteria);構造detachedCriteria,作為參數傳遞給departmentManager業務層代碼使用spring,DepartmentManager的findByCriteria如下:java代碼:public List findByCriteria(final DetachedCriteria detachedCriteria) {
return (List) getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
return criteria.list();
}
});
}實際上也就是:java代碼:Criteria criteria = detachedCriteria.getExecutableCriteria(session);
return criteria.list(); 而已但是該程序代碼執行,會拋出強制類型轉換異常!我跟蹤了一下spring和Hibernate源代碼,原因如下:spring的HibernateTemplate的execute方法提供的回調介面具有Session作為參數,但是實際上,默認情況下,HibernateTemplate傳遞給回調介面的session並不是org.hibernate.impl.SessionImpl類,而是SessionImpl類的一個Proxy類。之所以替換成為一個Proxy類,HibernateTemplate的注釋說明,Proxy提供了一些額外的功能,包括自動設置Cachable,Transaction的超時時間,Session資源的更積極的關閉等等。java代碼:private boolean exposeNativeSession = false;
... execute方法內部:Session sessionToExpose = (exposeNativeSession ? session : createSessionProxy(session));但是遺憾的是,Hibernate的DetachedCriteria的setExecutableCriteria方法卻要求將session參數強制轉為SessionImpl,但是spring傳過來的卻是一個Proxy類,因此就報錯了。java代碼:public Criteria getExecutableCriteria(Session session) {
impl.setSession( (SessionImpl) session ); // 要求SessionImpl,Spring傳遞的是Proxy
return impl;
}解決方法,禁止Spring的HibernateTemplate傳遞Proxy類,強制要求它傳遞真實的SessionImpl類,即給exexute方法增加一個參數,提供參數為true,如下:java代碼:public List findByCriteria(final DetachedCriteria detachedCriteria) {
return (List) getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
return criteria.list();
}
}, true);
}
B. hibernate如何執行原生sql插入 即用hibernate執行insert into table values();
首先幫你要知道,有很多技術框架可以的。就說通過通過hibernate的ORM吧。
寫個POJO類,再調用它的對象,PO;
創建session對象,
Session s=HibernateSessionFactory.getSession();
s.save(PO);
Transaction tx=s.beginTransaction();
tx.commit();
C. SSH中HibernateDaoSupport執行sql語句
用到HibernateDaoSupport,當this.getHibernateTemplate().save() 的時候會默認返回一個值的,不過這個值是序列類型,需要先.toStirng()然後在Integer.parseInt("")轉化成整型,這個最後的值就是最新的ID了。
D. hibernate對SQL語句的使用
如下代碼:
(注意該類繼承自HibernateDaoSupport ,要在applicationContext.xml中將sessionFactory注入此類中)
public class DaoUtil extends HibernateDaoSupport {
public Object executeMySQL(final String sql){
System.out.println(sql);
return getHibernateTemplate().execute( new HibernateCallback(){
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Connection CurConn = session.connection();
PreparedStatement ps = CurConn.prepareStatement(sql);
ps.execute();
ps.close();
session.flush();
return null;
}
} );
}
public Object executeBetchSQL(final ArrayList sqlList){
return getHibernateTemplate().execute( new HibernateCallback(){
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Connection CurConn = session.connection();
int count = sqlList.size();
for(int i=0;i//System.out.println(sqlList.get(i));
PreparedStatement ps = CurConn.prepareStatement(sqlList.get(i));
ps.execute();
ps.close();
session.flush();
}
return null;
}
} );
}
public static DaoUtil getFromApplicationContext(
ApplicationContext ctx) {
return (DaoUtil) ctx.getBean("DaoUtil");
}
}
E. Hibernate 怎樣 執行sql語句,獲得查詢到的值
這個你都要糾結嘛。。直接聲明一個int 類型的 變數來接收這個值就可以了,我一般都是把這個寫在一個方法裡面,這個方法的返回值為Int 在這個方法裡面,取出這個值,返回即可。
F. hibernate執行SQL小問題~~高分
1、Hibernate在用hql查詢的時候 可以返回存儲持久對象(PO)的list介面.比如 執行HQL:
from User where 1=1
它就返回一個轉載持久對象User的list
2、但是用sql查詢的時候它是不會返回一個持久對象的list的.它只會一個裝載object[]類型的list介面。
比如執行SQL:
select id,username,password from user where 1=1
List list = null;
try {
list = .exeSql("select id,username,password from User");
//注意這個sql返回的是一個List<Object[]>對象
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(Object[] o:list){ //強制轉化為object[]對象,數組的長度區決於你的sql查詢多少個列的數據.....
System.out.print(((Integer)o[0])+"\t"); //假設你的id為整數
System.out.print(((String)o[1])+"\t"); //username 強制轉化為String對象
System.out.println(((String)o[2])); //password強制轉化為String對象
}
G. hibernate執行sql語句問題
HQL執行語句:
update A(對象) set A.a(對象.屬性) = "12" where A(對象.屬性) = "car1"
SQL執行語句:
update A(表名) set a(欄位名) = "12" where car(欄位名) = "car1"
就我知道暫時兩種執行方式
H. hibernate怎麼調用自己的sql語句
我寫個簡單的例子,樓主可以參考下public int getLogin(String username,String password)
{ String sql="select * from user_table where username=? and password=?";
SQLQuery query=getSession().createSQLQuery(sql).addEntity(UserTable.class);
query.setString(0,username);
query.setString(1,password);
return Integer.parseInt(query.uniqueResult().toString());
}
public static void main(String[] args) {
new UserTableDAO().getLogin("zhang","yuan");
}