[英]how to make HQL that will generate SQL to insert multiple values in one statement?
我需要休眠來生成這樣的sql INSERT INTO table_a (a_id, a_name) VALUES (5, 'a5'),(6, 'a6');
.
使用這樣的 sql,您可以使用 1 條語句添加 2 行。 我可以得到
a_id, a_name
------------------
5 a5
6 a6
在休眠時,當您保存一組一對多關系時,休眠將插入多個插入語句。 如果您使用 HQL 將 1000 行插入到 1 個表中,這將導致如下結果:
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
我的測試結果是,1 條 1000 值(0.02 秒)的語句將比 1000 條插入語句快大約39 倍,每個語句都有 1 值(0.78 秒),就像休眠一樣。 那么有沒有一種方法可以讓 HQL 生成類似用於插入或更新的 SQL。 或者這意味着我們必須覆蓋休眠方言?
感謝您的任何提示
您可以將hibernate.jdbc.batch_size
屬性設置為非零值。 它將允許Hibernate使用批處理INSERT。 看一下官方文檔 。
以下代碼是如何通過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批量大小混亂
在 Hibernate 文檔中有一個關於批處理的非常好的章節。
設置屬性
hibernate.jdbc.batch_size 20
然后使用此代碼
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
Customer customer = new Customer(.....);
session.save(customer);
if ( i % 20 == 0 ) { //20, same as the JDBC batch size
//flush a batch of inserts and release memory:
session.flush();
session.clear();
}
}
tx.commit();
session.close();
根據您的需要從上面的代碼中更改customer
對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.