我需要休眠來生成這樣的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?或者這意味着我們必須重寫休眠方言?
感謝您的任何暗示
據我所知,batch_size設置是一個內存優化的問題,以儘量減少來回內存泄漏。 **插入在一個事務中仍然是多重語句**。所以batch_size不是這裏的解決方案。但是,無論如何感謝。 – Angga
正如[Hibernate批量大小混亂](http://stackoverflow.com/questions/6687422/hibernate-batch-size-confusion)中所述,'hibernate.jdbc.batch_size'允許使用JDBC2 API功能,如果主鍵不是**'GenerationType.Identity',則將**連續的** INSERT語句與**相同的簽名**(表格和列)合併爲一個具有多個**的語句。 –
是的,並且**連續的INSERT語句**與**單個INSERT語句**不同。正如我之前在我的評論中所說的那樣,**插入在一個事務中仍然是多重語句**。 – Angga