首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使生成SQL的HQL在一个语句中插入多个值?

如何使生成SQL的HQL在一个语句中插入多个值?
EN

Stack Overflow用户
提问于 2013-07-25 15:21:45
回答 3查看 3.7K关注 0票数 7

我需要hibernate来生成类似于这个INSERT INTO table_a (a_id, a_name) VALUES (5, 'a5'),(6, 'a6');的sql。

使用这种sql,您可以添加带有1条语句的2行。我可以

代码语言:javascript
复制
a_id, a_name

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

在hibernate中,当您将one保存到多个关系时,hibernate将使用多个insert语句进行插入。这将导致如果使用HQL将1000行插入到1个表中,则会导致如下所示:

代码语言:javascript
复制
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');

经过的时间是:

代码语言:javascript
复制
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');会导致这样的运行时间:

代码语言:javascript
复制
Query 1 of 1, Rows read: 0, Elapsed time (seconds) - Total: 0.02, SQL query: 0.02, Building output: 0

我测试的结果是,1条1000值的语句(0.02s)的比1000 insert语句快39倍,每个语句都有一个值(0.78s),就像hibernate一样。因此,是否有一种方法可以使HQL生成类似于insert或update的SQL。或者这意味着我们必须覆盖hibernate方言?

谢谢你的暗示

EN

回答 3

Stack Overflow用户

发布于 2013-08-23 14:52:58

HQL只支持插入到………。选择………;没有机会将插入写入………值,我的意思是在编写insert查询时,我们需要从其他表中选择值,我们不能手动插入自己的值。(见文件)

票数 2
EN

Stack Overflow用户

发布于 2013-08-15 11:29:13

您可以将hibernate.jdbc.batch_size属性设置为非零值。它将允许Hibernate使用批处理插入。看看正式文件

下面的代码是如何通过Hibernate使用JDBC批处理插入的示例:

代码语言:javascript
复制
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批量混淆

票数 0
EN

Stack Overflow用户

发布于 2022-01-11 04:11:44

关于Hibernate文档中的批处理,有一个非常好的章节。

设置属性

代码语言:javascript
复制
hibernate.jdbc.batch_size 20

然后使用以下代码

代码语言:javascript
复制
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对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17862180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档