2012-03-05 134 views
1

我看到網上的教程顯示,你可以做這樣的事情了刪除和更新在休眠:Java的休眠插入

Query query = session.createQuery("delete Stock where stockCode = :stockCode"); 
query.setParameter("stockCode", "7277"); 
int result = query.executeUpdate(); 

在同一個教程中,我碰到這個代碼來插入:

Query query = session.createQuery("insert into Stock(stock_code, stock_name)" + 
      "select stock_code, stock_name from backup_stock"); 
int result = query.executeUpdate(); 

我的問題是,是否可以做一些類似於教程中的刪除示例,但是對於插入方法,可以使用setParameter?我試過這樣的事情,並得到一個錯誤:

Query q = session.createQuery("insert into test(:testname)"); 
q.setParameter("testname", "tester"); 

錯誤是關於性能。我之所以使用上面的代碼是因爲

int result = query.executeUpdate() 

它可以返回一個結果來驗證我是否通過SQL命令成功插入或不。

回答

1

第一件事:

setParameter

已經創建在HQL查詢,而不是字段名稱參數。

第二件事:

你的要求:insert into test(:testname)似乎不完整的,應該是這樣的insert into [TABLE_NAME]([FIELD_NAME],...) values ([VALUE],...)和在這種情況下,你應該使用SQL查詢搭配:

createSQLQueries

參見:http://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/Session.html#createSQLQuery(java.lang.String)

。爲什麼你需要使你的查詢如此動態?

和插入到數據庫將與保存較好:

session.save(youHibernateObject); 

與youHibernateObject與休眠模式映射架構映射的對象。祝你好運。

0

你可能有錯誤的SQL語法

首先用於插入語句的SQL語法:

insert into <table_name> (col1, col2, col3) 
values ('1', 'second value', 'third value') 

所以,如果你有一個名爲「測試」表只有一個字符串類型稱爲TEST_NAME列插入語句應該是:

insert into test (test_name) 
    values ('tester') 

既然你想要的TEST_NAME的值是可配置的,你會寫這樣的代碼:

Query q = session.createQuery("insert into com.yourpackage.Test (test_name) values (:testname)"); 
q.setParameter("testname", "tester"); 
int result = query.executeUpdate() 

其中com.yourpackage.Test是POJO實體類。

另一方面,我不會推薦像這樣使用hibernate。 這是更好地使用save()方法:

session.save(new Test("Testname")); 

要驗證一切都很好,寫的整合或JUnit測試。

看一看這種模式:

http://salto-db.sourceforge.net/salto-db-generator/plugins/ejb3hibernatedao.html

實現它,玩

好運