在本文中,我们将给您介绍关于如何在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)
- java – 在Hibernate中使用Native SQL批量插入
- java – 如何在Hibernate中创建/调用sql视图
- java – 如何在hibernate中启用批量插入?
- sql – 如何在Hibernate中使用数组字段制作条件
如何在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批量插入
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中实现了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视图
<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??,而不创建一个新实体?
解决方法
重要的一点是,您不应更改实体中的值,因为视图是只读的.
编辑:我不知道如何使用像存储过程一样的视图.如果存储过程的目的是查询注释中隐含的多个实体,则可以:
>使视图“宽泛”足以包含所需实体的所有必要属性
>使用视图中的外键列与相关实体相关,并为映射到视图的实体定义@ * To *注释.
我担心这不会带给你很远,因为你仍然需要使用本机sql或定义一个实体.
java – 如何在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基本.
我错过了一个设置?
解决方法
<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中使用数组字段制作条件
所以我不知道如何使这个条件在数组中找到一个值.
喜欢这个查询
SELECT * FROM cpfbloqueado WHERE bloqueados @> ARRAY['V']::character[]
解决方法
关于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中使用数组字段制作条件等相关内容,可以在本站寻找。
本文标签: