我正在尝试使用Jpa进行选择。 我尝试这样做的实体是这样的:
@Entity
public class A {
private String fieldOne;
private String fieldTwo;
private String fieldThree;
private B fieldFour;
@Id
public String getFieldOne(){...}
@Id
public String getFieldTwo(){...}
@Id
@OneToOne
public B getFieldThree(){...}
public String getFieldFour(){...}
....
@Entity
public class B {
private CompositeId id;
....
@EmbeddedId
public CompositeId getId(){
return MyUUIDGenerator.generateCompositeId();
}
....
我正在尝试的插件非常简单:
insert into A (fieldOne, fieldTwo, fieldThree, fieldFour)
select 'staticValueOne', 'staticValueTwo', B.id, 'staticValueFour' from B
where ....
'staticValueX'是由应用程序计算的值,我需要为给定的B元素集合等于所有值。
在执行期间,应用程序返回异常:
java.lang.IllegalArgumentException:org.hibernate.QueryException:可以 只生成id作为批量插入的一部分,具有序列或 插入后样式生成器[插入...
我不明白为什么,因为我在A中没有任何生成的值,我给插入所需的所有值。 有没有人建议理解这种行为?
谢谢!
编辑:稍微更新一下......
我改变了A类,只有一个String类型的字段标记为@Id,但是hibernate在正确构建查询时会出错:表别名与字段名称的关联会遗漏一些字段。
答案 0 :(得分:0)
从 JPA 2.0规范 ,章 4.2声明类型 :
Java Persistence查询语言语句可以是select 语句,更新语句或删除语句。 (...)
在BNF语法中,查询语言语句定义为:
QL_statement :: = select_statement | update_statement | delete_statement
而不是JPA中不支持的SELECT语句(在JPQL或Criteria API中),而是在事务中的实体上使用ElementManager.persist
。当事务提交时,实体被写入数据库(SQL INSERT将由Hibernate隐式完成,它充当持久性提供者)。
编辑:如果插入次数很多,您可以仔细查看Hibernate的批量插入。另一个选择是放弃JPA并直接使用JDBC的批量插入(PreparedStatement
)。