GVKun编程网logo

如何在Hibernate中使用SELECT插入(hibernate select for update)

3

在本文中,我们将给您介绍关于如何在Hibernate中使用SELECT插入的详细内容,并且为您解答hibernateselectforupdate的相关问题,此外,我们还将为您提供关于java–在Hi

在本文中,我们将给您介绍关于如何在Hibernate中使用SELECT插入的详细内容,并且为您解答hibernate select for update的相关问题,此外,我们还将为您提供关于java – 在Hibernate中使用Native SQL批量插入、java – 如何在Hibernate中创建/调用sql视图、java – 如何在hibernate中启用批量插入?、sql – 如何在Hibernate中使用数组字段制作条件的知识。

本文目录一览:

如何在Hibernate中使用SELECT插入(hibernate select for update)

如何在Hibernate中使用SELECT插入(hibernate select for update)

我需要在休眠状态下实现以下请求:

insert into my_table(....,max_column)values(...,(select max(id) from special_table where ....))

在hibernate中,如何使用注释?special_table可能不是my_table的子项或依赖项,而可能不是子选择项。

答案1

小编典典

您可以使用INSERT INTO … SELECT
…功能:

int updateCount = session.createQuery("""    insert into MyEntity(        ...,        max_column    )     select         ...,         max(id)     from SpecialEntity     """).executeUpdate();

java – 在Hibernate中使用Native SQL批量插入

java – 在Hibernate中使用Native SQL批量插入

我想使用Hibernate Native sql在数据库中插入记录.代码如下所示
Session session = sessionFactory.openSession();
 Transaction tx = session.beginTransaction();

String sqlInsert = "insert into sampletbl (name) values (?) ";
for(String name : list){
   session.createsqlQuery( sqlInsert )
          .setParameter(1,name)
          .executeUpdate();
} 
tx.commit();
session.close();

上面的代码工作正常.我认为这不是最好的方法.
如果有的话,请给我另一种可能的方法.
谢谢

解决方法

Hibernate有一个批处理功能.但在上面的例子中,我使用的是Native sql,根据我的观察,hibernate批处理对于Native sql来说效果不是很好.是的,它确实避免了内存不足错误,但没有提高性能.
因此我退回到在Hibernate中实现了JDBC Batch.Hibernate提供了方法doWork()来从Hibernate Session获取Connection.
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
//get Connction from Session
session.doWork(new Work() {
       @Override
       public void execute(Connection conn) throws sqlException {
          PreparedStatement pstmt = null;
          try{
           String sqlInsert = "insert into sampletbl (name) values (?) ";
           pstmt = conn.prepareStatement(sqlInsert );
           int i=0;
           for(String name : list){
               pstmt .setString(1,name);
               pstmt .addBatch();

               //20 : JDBC batch size
             if ( i % 20 == 0 ) { 
                pstmt .executeBatch();
              }
              i++;
           }
           pstmt .executeBatch();
         }
         finally{
           pstmt .close();
         }                                
     }
});
tx.commit();
session.close();

java – 如何在Hibernate中创建/调用sql视图

java – 如何在Hibernate中创建/调用sql视图

这是在document.hbm.xml中创建的视图

<database-object>
    <create><![CDATA[CREATE VIEW docView
     AS
     SELECT * from document;
     GO]]></create>
    <drop>DROP VIEW docView</drop>
    <dialect-scope name='org.hibernate.dialect.sqlServerDialect' />
</database-object>

现在如何在我的方法中调用此视图

试着像这样打电话

Session session = sessFactory.openSession();
Query query = session.createsqlQuery("docView");
List<?> list = query.list();

结束了

Caused by: java.sql.sqlException: The request for procedure 'docView' Failed because 'docView' is a view object.
at net.sourceforge.jtds.jdbc.sqlDiagnostic.addDiagnostic(sqlDiagnostic.java:368)
at net.sourceforge.jtds.jdbc.Tdscore.tdsErrorToken(Tdscore.java:2820)
at net.sourceforge.jtds.jdbc.Tdscore.nextToken(Tdscore.java:2258)
at net.sourceforge.jtds.jdbc.Tdscore.getMoreResults(Tdscore.java:632)

任何想法或任何其他方式在hibernate中调用sql视图?

总之是有没有办法调用视图just like a stored procedure??,而不创建一个新实体?

解决方法

您可以使用DB视图,就像它是常规实体表一样.使用@Entity批注或等效XML以及视图列的任意子集作为字段定义实体类.

重要的一点是,您不应更改实体中的值,因为视图是只读的.

编辑:我不知道如何使用像存储过程一样的视图.如果存储过程的目的是查询注释中隐含的多个实体,则可以:

>使视图“宽泛”足以包含所需实体的所有必要属性
>使用视图中的外键列与相关实体相关,并为映射到视图的实体定义@ * To *注释.

我担心这不会带给你很远,因为你仍然需要使用本机sql或定义一个实体.

java – 如何在hibernate中启用批量插入?

java – 如何在hibernate中启用批量插入?

使用hibernate,当我尝试启用批量插入
<property name="jdbc.batch_size">50</property>

我得到以下输出:

[...] cfg.SettingsFactory INFO  - JDBC batch updates for versioned data: disabled
 [...] cfg.SettingsFactory INFO  - Order sql inserts for batching: disabled

然后这个:

[...] jdbc.AbstractBatcher DEBUG - Executing batch size: 1

从不超过批量:1基本.

我错过了一个设置?

解决方法

到 enable batching for both INSERT and UPDATE statements,您需要设置以下所有Hibernate属性:
<property name="hibernate.jdbc.batch_size">30</property>
<property name="hibernate.order_inserts">true</property>
<property name="hibernate.order_updates">true</property>
<property name="hibernate.jdbc.batch_versioned_data">true</property>

如果您可以使用SEQUENCE<那么你不应该使用IDENTITY发电机,因为it disables batch fetching.

如果您不能使用SEQUENCE(例如MysqL),请尝试使用单独的机制来启用批量插入(例如jOOQ),而不是使用不会缩放并具有高性能损失的TABLE生成器.

sql – 如何在Hibernate中使用数组字段制作条件

sql – 如何在Hibernate中使用数组字段制作条件

我正在使用Hibernate和Postgres并定义了一个字符(1)[]列类型.

所以我不知道如何使这个条件在数组中找到一个值.

喜欢这个查询

SELECT * FROM cpfbloqueado WHERE bloqueados @> ARRAY['V']::character[]

解决方法

我不熟悉Postgres及其类型,但您可以使用 custom basic type mapping定义自己的类型.这可以简化查询.

关于Postres数组类型和Hibernate,在SO上有很多线程,例如,this one.另一个可能有用的数组映射示例is here.最后,here is an example使用Criteria和用户类型.

代码示例可以是

List result = session.createCriteria(Cpfbloqueado.class)
   .setProjection(Projections.projectionList()
      .add(Projections.property("characterColumn.attribute"),PostgresChararrayType.class)
   )
   .setResultTransformer(Transformer.aliasToBean(Cpfbloqueado.class))
   .add(...) // add where restrictions here 
   .list()

此外,如果它对实现不重要,您可以在实体模型中定义最大长度,使用@Column(length = 1)注释您的字段.

或者,如果您需要存储长度为1的字符数组,则可以使用collection type.

我希望我能说得对,但是,如果更好地描述问题域,那将会很好.

关于如何在Hibernate中使用SELECT插入hibernate select for update的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于java – 在Hibernate中使用Native SQL批量插入、java – 如何在Hibernate中创建/调用sql视图、java – 如何在hibernate中启用批量插入?、sql – 如何在Hibernate中使用数组字段制作条件等相关内容,可以在本站寻找。

本文标签: