2013-07-25 46 views
5

我需要休眠來生成這樣的INSERT INTO table_a (a_id, a_name) VALUES (5, 'a5'),(6, 'a6'); sql。如何使HQL生成SQL以在一個語句中插入多個值?

有了這樣的SQL,你可以添加2行1語句。我能得到

a_id, a_name 

------------------ 
5  a5 
6  a6 

當休眠,當您保存設置一對多的關係,冬眠將多個插入語句插入。這將導致如果插入1000行1 HQL表會導致這樣的事情:

INSERT INTO scoring.table_a (`a_id`, `a_name`) VALUES (1, 'a'); 
INSERT INTO scoring.table_a (`a_id`, `a_name`) VALUES (2, 'a'); 
.... 
... 
.. 
INSERT INTO scoring.table_a (`a_id`, `a_name`) VALUES (1000, 'a'); 

而且歷時時間:

Executed 1,000 queries; elapsed time (seconds) - Total: 0.78, SQL query: 0.78, Building output: 0 

當我用相同的值來測試,使用SQL INSERT INTO table_a (a_id, a_name) VALUES (5, 'a'),(6, 'a'),(),...,...,(1000, 'a');會導致經過的時間是這樣的:

Query 1 of 1, Rows read: 0, Elapsed time (seconds) - Total: 0.02, SQL query: 0.02, Building output: 0 

我測試的結果是,1000值(0.02秒)的1個語句將有約39倍的速度比1000插入語句每個都有1個值(0.78s)像hibernate一樣。那麼是否有辦法讓HQL生成像插入或更新一樣的SQL?或者這意味着我們必須重寫休眠方言?

感謝您的任何暗示

回答

0

您可以hibernate.jdbc.batch_size屬性設置爲一個非零值。它將允許Hibernate使用批量INSERT。看看a official documentation

下面的代碼是一個示例如何通過使用Hibernate JDBC批量插入:

Session session = sessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 
for (int i=0; i < 10000; i++) { 
    RecordA record = new RecordA(.....); 
    session.save(record); 
    if (i % BATCH_SIZE == 0) { // BATCH_SIZE is your choice, but equal to property 
     //flush a batch of inserts and release memory: 
     session.flush(); 
     session.clear(); 
    } 
} 
tx.commit(); 
session.close(); 

它還這裏討論:Hibernate batch size confusion

+1

據我所知,batch_size設置是一個內存優化的問題,以儘量減少來回內存泄漏。 **插入在一個事務中仍然是多重語句**。所以batch_size不是這裏的解決方案。但是,無論如何感謝。 – Angga

+0

正如[Hibernate批量大小混亂](http://stackoverflow.com/questions/6687422/hibernate-batch-size-confusion)中所述,'hibernate.jdbc.batch_size'允許使用JDBC2 API功能,如果主鍵不是**'GenerationType.Identity',則將**連續的** INSERT語句與**相同的簽名**(表格和列)合併爲一個具有多個**的語句。 –

+0

是的,並且**連續的INSERT語句**與**單個INSERT語句**不同。正如我之前在我的評論中所說的那樣,**插入在一個事務中仍然是多重語句**。 – Angga

0

HQL僅支持INSERT INTO ......... ......... SELECT;沒有機會寫INSERT INTO ......... VALUES,我的意思是在編寫插入查詢時,我們需要從其他表中選擇值,我們不能手動插入我們自己的值。 (see documentationthis

相關問題