簡體   English   中英

如何制作將生成 SQL 以在一條語句中插入多個值的 HQL?

[英]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批量大小混亂

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

在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM